디버깅을 하는 또 다른 방법이 있기에 번외편으로 간략하게 소개하고자 합니다.
예전에 DOSBox의 내장 디버거에 대한 소개를 한 적이 있습니다.
http://re-coder.blogspot.kr/2013/06/dosbox.html
이 내장 디버거를 사용하여 디버깅을 하는 방법입니다.
먼저 내장 디버거를 사용하는 경우의 장점은,
- 소스가 없어도 됩니다.
- 소스가 있다고 해도 디버그 모드로 다시 빌드할 필요도 없습니다.
- 터보디버거와 같은 별도의 디버거가 필요 없습니다.
반면에 단점은,
- 소스가 있어도 소스레벨 디버깅이나 소스와 연계된 디버깅이 불가능 합니다.
- 내장 디버거의 제한된 기능을 이용해야 하기에 비효율적일 수 있습니다. (아무래도 전문 디버거보다야 기능과 편의성이 떨어집니다.)
- 어셈블리어/로우레벨 디버깅/리버스엔지니어링과 관련된 일정한 수준 이상이 되어야 디버깅이 가능합니다.
저의 경우엔 마지막 조건에 부합하지 못하는 관계로 엄두를 내지는 못 할 상황이지만, 이번 Appler의 경우에만 가까스로 디버깅이 가능했던 듯 합니다.
먼저 내장 디버거가 활성화된 DOSBox를 실행시킵니다. |
DOSBox의 실행과 함께 표시된 디버거 화면 |
이제 디버깅을 하고자 하는 Appler를 실행시킵니다.
Appler 실행 |
DOSBox 화면에서 Alt-Pause를 누르면 실행이 중단되고 디버거에 입력이 가능하게 됩니다.
앞선 포스팅에서 알아낸 대로, 디버깅을 하기 위해 breakpoint로 지정할 부분이 INT 21 (AH=60h)입니다. 디버거에서 help를 입력하면 내장 디버거에서 사용할 수 있는 키와 명령어가 있습니다. 여기에 있는 대로 "bpint 21 60"을 입력 합니다.
INT 21 (AH=60h)에 대해 Breakpoint를 설정합니다. |
"bplist"를 입력하면 breakpoint가 설정이 되었는지 확인이 가능합니다.
breakpoint가 설정되었음을 확인 |
이제 내장 디버거에서 F5를 눌러서 Appler가 계속 실행을 하도록 해 줍니다.
적당한 시점에 문제가 되는 화면으로 진입하도록 Appler에서 F3 키를 눌러 줍니다.
idle 상태에서 F3을 눌러 Disk Manager로 진입 시도 |
이제 바로 실행이 멈추고 디버거가 활성화 되었습니다.
실행이 멈춘 곳은 breakpoint로 설정한 int 21 입니다.
INT 21h에서 멈춘 상황 |
디버거에서 F10(Step Over)로 int 21을 수행 한 후, Alt-D를 눌러 DS:SI의 메모리 내용을 확인해 봅니다. 역시나 마지막에 Backslash가 없음을 알 수 있습니다.
INT 21h을 실행 후 메모리 확인 |
SM 명령어를 이용하여 마지막에 Backslash(5C)를 넣어 줍니다.
Set Memory로 backslash 추가 |
마지막에 Backslash가 추가되었음을 확인할 수 있습니다.
메모리 변경 확인 |
이제 다시 F5를 눌러 실행을 계속 하도록 합니다.
아마 2~3번 정도 같은 부분에서 멈출 것이고, 그 때마다 위의 과정을 반복해야 합니다.
(Step Over, Memory 확인, Memory 수정)
이렇게 하고 나면 정상적인 화면이 나오는 것을 볼 수 있습니다.
정상 화면 |
만약에 소스를 가진 DOS용 프로그램을 DOSBox의 내장 디버거로 디버깅을 하려면, 소스빌드시에 Map 파일과 Assembly Listing 파일을 만들도록 하면 디버깅에 조금 도움이 되지 않을까 싶습니다.
댓글 없음:
댓글 쓰기