본문 바로가기

My Study/Reversing

WinDbg 어플리케이션 크래쉬 발생 시 자동으로 붙게하기

보통 어플리케이션을 사용하다가 크래쉬가 난 적이 있을 것입니다.

위와 같은 화면을 본신적이 있을 것입니다.

보통은 보내지 않음을 누르며 끄게 되죠. 

WinDbg를 설치하면 WinDbg에서는 이런 경고창 대신 오류난 지점에 바로 디버거가 붙도록 할 수 있습니다.

cmd창에서 windbg -I 라고 쳐 주시면 위와 같이 디폴트로 windbg가 postmortem 디버거로 설정 됬다고 나옵니다.

이제 크래쉬가 나면 windbg가 자동으로 붙게 되겠죠. 일부러 크래쉬 나는 파일을 작성해 실험을 해보겠습니다.

크래쉬가 나는 소스코드 입니다. 컴파일 후 실행을 시켜보겠습니다.

자동으로 windbg가 켜지면서 오류가 난 지점을 정확히 보여주고 있습니다. 딱 보니 주소 00000000을 참조하고 있다고 나오네요.
어디서 오류가 나는지 바로 찾을 수 있겠죠. 왜 오류가 나는지까지두요.

그러면 이러한 기능을 끄려면 어떻게 해야될까요???

간단히 레지값만 수정시켜 주거나 삭제해주면 됩니다.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
(보기 좋게 색을 넣어봤습니다.)
해당 위치로 가보겠습니다.

Auto : 1 -> 크래쉬 발생 시 자동으로 Debugger에 설정된 디버거가 실행
         0 -> 디버거 자동으로 붙지 않음

0으로 수정시키고 크래쉬를 일으키면 가장 위에 있던 그림처럼 오류창이 발생 될 것입니다.

디버그를 누르게 되면 Debugger라고 설정된 디버거가 실행이 될 것입니다.

그러면 Debugger부분을 보도록 하겠습니다.
"C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe" -p %ld -e %ld -g
쌍따옴표 안에 들어간 경로는 디버거의 절대경로 입니다.
그리고 뒤에 이상한 옵션들이 붙어있습니다.
-p %ld : 크래쉬 난 프로세스 PID값 전달
-e %ld : 크래쉬가 발생되어 처리할 디버그 이벤트.. 핸들이 전달
-g : 디버거 실행되는 순간에 대기 없이 계속 디버기를 수행할 것
이렇게 됩니다. 쌍따옴표 안의 경로를 다른 디버거로 해줄 경우 다른 크래쉬가 났을 때 다른 디버거가 켜질 것 입니다.