2009년 10월 3일 토요일

응용프로그램의 덤프파일 분석 (WinDbg, Dr. Watson)

다음 내용은 "응용프로그램이 비정상 종료 되었을 때,Dr. Watson에 의해서 생성된 덤프파일을 WinDbg를 사용하여 분석하는 방법"

대해서 설명하고 있습니다.


[단계 1] Dr. Watson 설정


?? 먼저, 응용프로그램의 비정상종료 되었을 때, Dr. Watson에 의해서 덤프파일이 생성될 수 있도록,

?? 다음과 같이 Dr. Watson을 시스템의 기본 디버거로 설정을 합니다.

??

?? 참고로, 위와 같이 설정은 다음 레지스트리에 기록이 됩니다.

?? [32비트 윈도우] \\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug?

?? [64비트 윈도우] \\HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug


[단계 2] Dr. Watson 설정확인


? 다음과 같이 Dr. Watson을 실행합니다.

?

? 그리고, 실행되어진 Dr. Watson 윈도우 응용프로그램에서 "크래쉬 덤프" 경로와

? "크레쉬 덤프 유형" 값을 적절히 설정합니다.

?

? (※ 참고로, "크레쉬 덤프 경로"는 응용프로그램이 비정상 종료될 때마다, 덤프파일이 생성되어지는 곳입니다. )


[단계 3] 테스트 용 소스 코드 작성


?? 설명의 편의상 다음과 같이, 비정상 종료되어지는 샘플 응용프로그램을 작성합니다.

#include <windows.h>
#include <stdio.h>

void BadPtrFunc(char *ptr)
{
*ptr = *ptr / 0; /* Null pointer exception + divide by zero */
}

int main(int argc, char **argv)
{
char *ptr = NULL;
BadPtrFunc(ptr);
return 0;
}

[단계 4] Visual studio 설정

?? 컴파일 되어지는 응용프로그램에 디버깅 정보가 포함되어질 수 있도록, 다음과 같이 프로젝트 설정을 수정합니다.

??

??


[단계 5] WinDbg 설치

?? 다음 웹사이트 경로를 참조하여, WinDbg를 설치합니다.

?? http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx

??

?? (※ 참고로, WinDbg는 무료 프로그램입니다.)


[단계 6] 비정상 종료되는 응용프로그램 실행

[단계 3]을 통해서 만들어진 응용프로그램을 실행한 후, 덤프파일이 생성되어 있는지 확인합니다.



[단계 7] 덤프 파일 분석

덤프파일을 분석하기 위해서 WinDbg를 실행 한 후, 다음과 같이 덤프파일, 심볼 경로, 소스 경로를 설정합니다.

> 덤프파일 설정? [File] -> [Open Crash Dump???? Ctrl + D] 메뉴를 통해서 덤프파일을 설정합니다.

> 심볼경로 설정? [File] -> [Symbol File Path ? ???? Ctrl + S] 메뉴를 통해서 심볼경로를 설정합니다.

?? 참고로, 심볼경로는 Visual Studio를 사용하여 컴파일 할 때, 생성 되어지는 pdb 파일의 경로를 설정합니다.

?? 그리고, 다음과 같이 "Symbol Store Path"를 설정합니다. (시스템에 "c:\websymbol"이라는 폴더가 존재한다고 가정함.)



> 소스파일 설정? [File] -> [Source File Path ???? ? Ctrl + P] 메뉴를 통해서 소스경로을 설정합니다.


위와 같이 설정이 완료되었으면, 다음과 같이 "!analyze -v" 명령어를 통해서 덤프파일을 분석합니다.

명령어를 입력한 후, 약 2~3초 정도 기다리면 "FAULTING_SOURCE_CODE" 정보를 WinDbg 커맨드 윈도우를 통해서

확인이 가능하며, 이 정보를 바탕으로 어느 부분이 잘못되었는지 확인 할 수 있습니다.

이 외에도 WinDbg 커맨드창에서는, "kn", ".frame", "dv", "dt"와 같은 유용한 디버깅 명령어들을 사용할 수 있습니다. (다음 그림 참고)


이 때, 특정 명령어의 쓰임새를 알고 싶을 경우에는 다음과 같은 명령어를 WinDbg의 커맨드 창에 입력하면 됩니다.

.hh <command>


예를 들어, 모든 지역 변수를 프린트 하는 dv 라는 명령어를 알고 싶으면

.hh dv 라고 입력하면, 다음과 같은 도움말이 화면에 표시 됩니다.

댓글 없음:

댓글 쓰기