| [ CnUnix ] in KIDS 글 쓴 이(By): dkkang (압셍트) 날 짜 (Date): 2003년 3월 5일 수요일 오후 04시 04분 45초 제 목(Title): Re: 디버거 동작원리를 좀 알고 싶은데요.. Undocumented Windows는 저도 많이 실망했습니다. Undocumented DOS가 성공하니까, 대충 써낸 거 같더군요. 역시 옛날 거지만 Undocumented PC는 좀 낫더군요. 저자가 다르지만... http://www.undoc.com/bookstore.html 에 가니 리스트들이 쭉 나오는군요. 대부분이 옛날에 신나게 사서 본거네요. 지금은 별 쓸모도 없는 데 그 때는 왜 샀는지... > 대강을 생각해보면, 아마 하나의 실행공간을 만들텐데, > system call을 가로채는 것은 어떻게 구현이 되는지 > 조금 의문이 갑니다. 네, 역시 아무래도 디버그할 프로그램을 위해 하나의 실행 공간을 만들어야 하겠죠. 그런데, 그러기 위해 시스템 콜을 가로챈다는 건 무슨 뜻인지 잘 모르겠네요. 좀 더 설명해주시겠습니까? > multi-thread인 경우에는 clone() API를 뭘로 대체했는지.. 앞에와 비슷한 이유인데, 대체를 해야 하는 이유가 확실하게 감이 안오는데요. gdb를 안써봐서 잘 모르는 데, 멀티쓰레딩인 경우나 fork(), clone(), exec()인 경우에는 어떤 식으로 수행이 됩니까? 옛날에 누가 멀티 쓰레드에 대해 강의하다가, 멀티쓰레딩은 디버깅이 어려운 단점이 있다 어쩌구 한 게 기억이 나는군요. 방금 리눅스에서 gdb에서 fork의 경우를 테스트해보니 계속 (n)ext를 치면 제어가 parent로 가서 parent만 수행이 되는군요. 제가 처음 써봐서 그런지 몰라도 한 스텝씩 수행을 하면 child는 아예 수행이 안되는군요. 제어가 child로 가게 할 수도 있나요? > 결국에는 glibc에 정의된 API 의 mapping list를 > 통해서 가니까, gdb거 glibc와 항상 같이 컴파일되는 > 것으로 봐서는 결국엔 DOS시절의 INT 3과 같은 방식일 > 것 같기도 하고요.. 앞에서 쓰고 나서 생각한 건데, 결국 INT3나 디버거로의 컨택스트 스위치 콜을 한다고 해도 해결해야할 문제가 좀 있긴 하더군요. 디버깅할 명령의 다음 명령들 앞에 브레이크 포인트나 컨택스트 스위치 콜을 삽입히고 나머지를 전부 밀려서 쓸 수는 없을텐데 말이죠. 디버깅할 부분의 바로 다음 명령들은 임시 장소에 저장하고 그 위에 디버거의 브레이크 포인트나 디버거로 돌아가는 컨택스트 스위치 콜을 오버라이트하는 수 밖에 없을텐데, 만일 다른 프로세스나 쓰레드가 디버그하는 루틴을 공유하는 상황이거나 그 메모리를 읽을 수만 있고 쓸 수 없는 상황이라면, 어떤 편법이라도 써야 하는 건지.. 사실 Linux 쪽이나 윈도우즈 쪽 디버거는 저도 아리송한 점이 많습니다만, 결국 스케줄러 비슷하게 할거라는 기본적인 방법은 같지 않겠냐는 막연한 생각이 들기도 하는군요. |