CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): dkkang (압셍트)
날 짜 (Date): 2003년 3월  5일 수요일 오전 01시 26분 13초
제 목(Title): Re: 디버거 동작원리를 좀 알고 싶은데요..


Andrew Schulman의 Undocumented DOS, 1st ed.를 보면, MS-DOS 초창기에 
DEBUG를 만들었던 사람이 쓴 챕터가 있습니다. 그외에도 위에서 언급한 다른 
책들을 보시면 될 겁니다. 오히려 제가 말씀드린 책이 더 구하기 어렵겠군요. 
:)
Intel CPU의 경우에는 INT 3가 Breakpoint를 지원하는 명령입니다. 즉 하드웨어 
브레이크 포인트입니다. (MS-DOS 관련 서비스들은 INT 21h이고요.)
브레이크 포인트를 넣고 싶은 부분에 INT 3을 집어넣으면 실행하다가 그 
자리에서 일단 정지합니다. 즉, 브레이크 포인트는 특정 CPU가 지원하는 경우가 
많고 안할 수도 있다는 게 맞을 겁니다. 
일단 브레이크가 걸린 상태에서, 계속 실행하고 싶거나 처음에 프로그램을 
로드한 상태에서 실행하고 싶을 때는, 지금 실행되는 디버거에서 디버깅하고 
있는 프로그램으로 CPU 내용을 컨택스트 스위치해버리면 될 거 같은 데, 그 
방법은 어셈블리를 좀 알면 쉽게 고안할 수 있고 간단한 멀티태스킹 운영체제들 
소스를 봐도 대부분 나옵니다. (왜냐면 스케줄링을 해야 하니까..) 최근에 XINU 
PC 버전을 뜯어 고치고 있는 데, 거기에도 나오더군요.
소스레벨 디버거들은 디버깅하는 프로그램의 소스 한 행마다 그에 대한 
어셈블리 명령들이 (C 같으면 대충 5~6개 되겠죠?) 뭔지 알고 있고, 행 단위로 
실행할 때는 그때그때마다 브레이크 포인트를 집어넣어주고 컨택스트 스위치를 
하는 식으로 하면 대충 될 거 같습니다. 
그런데 이렇게 초보적인 수준이다 보니, 시스템 프로그램들이나 디버깅이 
안되도록 감시하는 루틴은 심은 프로그램들은 디버깅하기 힘들었죠. 초기 
디버거들은 이 정도 수준 밖에 안되었는 데, 나중에 나온 디버거들은 
(SoftICE같은..) 점점 더 많은 기능들을 지원하고 더 
트랜스패런트(transparent)하게 마치 디버거가 없는 거처럼 수행할 수 있게 
되었습니다.
Unix는 잘 모르겠고, Linux는 비슷하거나 뜻밖에도 나름대로 소프트웨어적으로 
디버깅을 지원할지도 모르겠습니다.

생각나는 데로 써봤는 데 도움이 되셨길 바랍니다.

[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.