Kernel debugger 에서 User mode debug 하기

다수의 Thread 가 동작하는 Application 을 Debugging 을 하다 보면 동기화 때문에 문제가 될 경우가 많이 있습니다. 하나의 Process 에서 동기화가 동작하는 것이라면 WinDbg 를 사용해서 하나의 Process 만 살펴 본다면 되겠지만 다수늬 Process 에서 동기화를 처리 한다면 WinDbg 로 하나의 Process 를 멈추어 논다고 해도 다른 Process 는 계속 동작하게 됩니다. 이 경우 Kernel debugger 를 사용해서 User mode 를 Debugging 하는 것이 좋을 수 있습니다.

먼저 Target computer 에 Windbg 가 설치 되어 있어야 하고 Debug mode 로 Boot 되어 있어야 합니다.

다음 command 를 실행 합니다.

ntsd –d –p <PID>

여기서 –d 옵션이 중요한데 Output 과 Prompt 를 Kernel debugger 에서 나타나게 하겠다는 것 입니다. 이 명령을 실행하면 Hot 쪽의 Kernel debugger 에서 Break 가 발생하고 Prompt 가 나타나는 것을 보실 수 있습니다. Kernel debugger 이지만 ntsd 에서 입력한 PID 를 가지는 Process 를 user mode 에서 Debugging 하는 것 입니다.

이 경우 System 전체가 멈추어 있는 상태가 되고 Kernel debugger 에서 .breakin 명령을 사용해서 kernel mode 로 전환이 가능합니다.

Kernel mode 에서 다시 User mode 로 전환 하려면 Kernel debugger 에서 !bpid <pid> 를 해야 합니다. 여기서 주의 할 것은 pid 를 10 진수로 입력할 경우 pid 앞에 0n 을 넣어 주어야 합니다.

마지막으로 !bpid 명령의 경우 kernel mode 에서 Debugging 하다가 user mode 로 전환하고자 할때 유용합니다.

 

추가) Windbg 를 설치하면 Breakin.exe 라는 utility 가 있는데 이것은 Target 에서 특정 Process 에 대해서 Debug break event 를 발생 시켜서 Kernel debugger 에서 Break 되도록 하는데 사용합니다.