| [ 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는 비슷하거나 뜻밖에도 나름대로 소프트웨어적으로 디버깅을 지원할지도 모르겠습니다. 생각나는 데로 써봤는 데 도움이 되셨길 바랍니다. |