반응형
http://javahawk.egloos.com/10858930

WinDbg를 이용한 VMWare의 가상머신 Kernel debugging - WinDbg byKircheis

그러면 이번에는 실제 디버그 정보를 받아볼 WinDbg를 실행해 보자.
우선 WDK에 포함된 WinDbg를 실행해 보자.
나같은 경우에는 Debugging Tools for Windows (x64)라는 메뉴에 담긴 것을 실행했다.

WinDbg를 사용하여 Debuggee와 연결할 때는 비교적 상세한 정보를 받아서 보기를 원할 것이다.
다음으로 커널 디버깅을 하기 위한 메뉴를 선택한다.
메뉴에서 Kernel Debug라는 항목을 선택해 준다.

그러면, Kernel Debugging이라는 창이 나타난다.
이 창에서는 실제 VMWare에서 맞춰준 Debug 정보 내용을 확인하여 채워주면 된다.
우선 여기서는 COM2 포트를 가장하여 xcom이라는 pipe를 통해 받기로 이전에 설정했던 설정을 그대로 따라 맞춰준다.
Serial 통신으로 BR은 115200이었으니 이 또한 동일하게 맞춰준다.
Serial 통신에서 Baud Rate가 틀어질 경우 전문이 깨져서 나타나는 현상은 다반사이기 때문에 반드시 확인이 필요하다.
또한 pipe 통신을 사용할 것이기 때문에 Pipe 체크박스를 체크해 준다.
디버기 환경의 OS가 재부팅될 때 OS 부팅 과정의 디버그 정보까지 확인할 수 있도록 Reconnect를 체크해 준다.
확인을 눌러준다.

이제 디버깅 정보를 받을 준비가 모두 끝났다.
VMWare에서 Debuggee의 환경 정보까지 모두 마쳐졌다면, 이제 해당 OS를 실행시키면 된다.
디버그 환경에서 OS를 기동하면 역시 평소보다 기동되는 시간이 오래 걸린다.


일단 Ctrl-Break를 사용해서 디버기와 연결된 상태에서 정보를 잡아 보았다.
OS를 디버깅할 때는 상세한 정보를 확인할 수 있도록 MS에서 pdb 심볼 파일을 받을 수 있도록 제공해 주고 있다.
Symbol 파일을 받을 경로를 지정하면 실제 커널 단에서 수행되는 함수의 이름과 변수까지도 확인이 가능하다.
File - Symbol File Path를 선택하여 나타난 창에 심볼 파일 저장 경로와 MS 사이트를 주소를 포함해서 기록해 주면 된다.
위의 그림에서는 SRV*D:\DsSymbols*http://msdl.microsoft.com/download/Symbols;D:\DsSymbols 과 같이 설정된 것을 확인할 수 있다.
물론 이에 대해서는 커맨드 라인에서 명령어를 입력하여 지정 및 확인할 수 있다.
디버그 창에 나타난 정보들을 유심히 보면 여러가지 정보들을 알 수 있다.
특별히 *를 사용하여 작성된 창에서는 실행 중 프로세스를 중지시키고 다시 실행시키는 기능에 대한 설명이 포함되어 있다.
또한, 그 위의 정보를 살펴보면 현재 디버기의 환경의 정보를 몇 가지 확인해 볼 수 있다.
여기서 밑의 kd>로 표시된 커맨드 라인에 g를 입력하고 Enter를 치거나, F5키를 눌러서 다음 단계를 계속 실행시킬 수 있다.


커맨드 라인이 *BUSY*로 표시되면서 Debuggee is running...이라고 나타나고 있다.
이제 필요할 때 마다 Ctrl-Break로 멈춰서 원하는 정보를 확인할 수 있다.
Visual Studio를 사용하여 디버깅을 해본 사람들이라면 물론 한단계씩 진행하던 F10키를 요구할 수도 있다.
이것 또한 동일하게 제공되며, 이에 대한 커맨드 라인의 명령어는 p이다.
다음으로 브레이크 포인트를 잡아보자.


Break point를 잡기 위한 명령어는 bp이다.
화면처럼 bp nt!SwapContext라고 입력하면, 커널에서 사용하는 SwapContext 함수의 시작 부분에 bp를 설정할 수 있다.
물론 화면에 보이는 것과 같이 nt!KeUpdateSystemTime+0x38f 와 같은 포지션도 bp로 설정할 수 있다.
bp를 설정했다면, 이제 설정한 bp의 전체 리스트를 확인해 보자.
커맨드 라인에 bl을 입력하여 실행한다.
화면의 하단에 나타난 정보가 현재 설정된 bp들이다.
해당하는 소스의 위치와 포지션의 라인넘버까지 확인이 가능하다.
bp를 설정하면 역시 g를 입력 및 실행하여 해당 포인트에 대한 동작 직전 멈추는 것이 가능해 진다.
설정된 bp를 지우는 데에 사용되는 명령은 bc이다.

bc를 입력할 때는 bl로 확인하여 가장 앞에 나타난 인덱스 번호를 확인하여 입력해 준다.
그리고, 다시 bl을 실행하면 0번 인덱스로 설정되었던 내용이 삭제된 것을 확인할 수 있다.
WinDbg의 화면 상단에 나타난 Tool bar의 아이콘들을 선택하여 별도의 창을 열어서 확인할 수 있다.
물론 Alt-Number의 바로 가기 기능을 사용하여 창을 불러올 수도 있다.
Call Stack - Alt-6


Disassembly - Alt-7

Locals - Alt-3


Memory - Alt-5


Process and Threads - Alt-9



Registers - Alt-4


Watch - Alt-2

이 창들의 기능은 Visual Studio와 동일하기 때문에 이에 대한 별도의 설명은 생략한다.

실행 환경에서 자신이 배포한 프로그램에 대한 상세한 디버깅을 원한다면 소스 파일은 아니더라도 pdb 파일은 남겨두는 것이 엉뚱한 문제로 열을 내지 않아도 되는 방법이 될 것이다.

반응형

+ Recent posts