본문 바로가기
개발, IT

MiniDump 제작

by Nabi™ 2008. 12. 5.


제품 개발중에도 출시후에도 항상 나타나는 버그.
오늘도 버그를 잡기위해 하루종일 삽질을 한다. ㅋㅋ

물론 정말 머리가 뛰어나 천재적인 두뇌로 머리속에서 완벽한 설계를 하고 바로 코딩에 옮겨 전혀 버그없는 프로그램을 만드는게 목표이긴 하지만, 그건 정말 .. 천재라도 할 수 있을까? ㅎㅎ

예전부터 프로그램이 비정상적으로 종료가 될때 해당 정보를 저장하여 분석할 수 있으면 좋겠다라는 생각을 많이 했지만, 생각뿐이었었다.
오늘도 열씨미 개발하며 테스트를 하는데 중간에 뻣어버리는 프로그램 -_-
당최 어디서 죽는지 찾질못해 헤매는 도중 Devpia에서 Dump 제작하는 팁을 찾았다~
내용을 보니 바로 내가 찾던것~ㅎㅎㅎㅎㅎㅎ
아무생각 없이 길가다가 만원짜리 주운 심정이라고나 할까? ㅋ

아무튼 설명도 잘되있고 친전하게 소스코드까지 올려주시니 안받아볼수가 있나...
바로 받아서 해봤는데.. 오~~ 너무 좋아. 내가 찾던거야 ㅋㅋ

프로젝트에 바로 적용해봐야할듯 하다. (솔직히 버그가 좀 많다. 드러나지 않을 뿐이지 -_-)
아무튼 관련내용을 긁어다 붙여본다. ㅎ

==============================================================================================================

[MiniDump 생성]

 

보통 exception을 잡아내기 위해 __try~__except, try~catch를 많이 사용합니다.

 

__try~__exceptEXCEPTION_EXECUTE_HANDLER 예외 상황이 발생했을 경우 효율적인 제어가 가능합니다.

미니 덤프 필요한 정보를 획득하기에도 효율적이구요.

하지만 가장 단점이 클래스와 같은 객체에 대한 사용이 불가능 합니다.

(제가 겪어본 바로는요;;; 아닌가요?;;;; 아니라면 저에게 가르침을 주세요~~~)

 

try~catchGetExceptionInformation API를 사용하는데 살짝 애먹고! 또 한 예외 상황에 대한 비동기 옵션을

주지 않으면 뻗어버린다는...

 

이러한 이유로 CodeProject 미니 덤프 소스를 기반으로 하여 __try~__except, try~catch 모두 지원하는 클래스를 만들어보았습니다.

 

# __try ~ __except 사용하는 경우

아래와 같이 CzMiniDump 상속 받습니다.

__try ~ except 사용하고 _except 발생 Create_Dump(GetExceptionInformation(), TRUE, TRUE), EXCEPTION_EXECUTE_HANDLER 호출하면 됩니다.

(Create_Dump CzMiniDump 구현되어있습니다.)

class CzDump_INHERITANCE : CzMiniDump

{

public:

           CzDump_INHERITANCE(){}

           ~CzDump_INHERITANCE(){}

 

public:

           void Test()

           {

                           __try

                           {

                                        TCHAR* p = NULL; // 오류 발생

                                        _tcscpy(p, _T("ABCDEFG")); // 오류 발생

                           }

                           __except(Create_Dump(GetExceptionInformation(), TRUE, TRUE), EXCEPTION_EXECUTE_HANDLER)

                           {

 

                           }

           }

};

 

 

# try ~ catch 사용하는 경우

<주의> 반드시 아래 캡쳐된 화면과 같이 옵션을 설정해야 합니다. 옵션은 SHE 대한 비동기를 지원하여 예외 발생 오류 발생창이 뜨지 않고 사태를 수습할 있도록

해줍니다.

 

사용법은 아래와 같이 try 진입 MACRO 선언합니다. (MACRO 대한 정보는 zMiniDump.h 파일에 있습니다. _set_se_translator API 오류 처리 함수를 연결 시켜놓은 정도입니다.)

-      ZDUMP_ONLYMSG : 메시지 박스만 표시

-      ZDUMP_ONLYDUMP : 덤프 파일만 생성

-      ZDUMP_MSGDUMP : 메시지 박스를 표시하고 덤프 파일 생성



class CzDump_MACRO

{

public:

           CzDump_MACRO(){}

           ~CzDump_MACRO(){}

 

public:

           void Test()

           {

                     //ZDUMP_ONLYMSG;

                     //ZDUMP_ONLYDUMP;

                     ZDUMP_MSGDUMP;

 

                        try

                           {

                                        CzTest zTest; // 클래스 객체 선언

                                        TCHAR* p = NULL; // 오류 발생

                                        _tcscpy(p, _T("ABCDEFG")); // 오류 발생

                           }

                           catch(...)

                           {

 

                           }

           }

};

 

# 메시지 덤프 파일 확인

코드를 호출하게 되면 오류 발생 코드를 만나게 되어 우리가 원하는 덤프 메시지 창을 보여준다던지 덤프를 파일로 기록한다던지의 작업을 수행할 있습니다.

덤프 파일은 ModuleName(yyyy-mm-dd hh;mm;ss;ms).dmp 포맷으로 남기고 있습니다.



# 덤프 파일을 이용한 비정상 동작 코드 위치 추적

그럼 파일로 기록된 덤프 파일을 이용하여 비정상 동작 코드의 위치를 추적해보겠습니다.

(류선임님이 가르쳐준 지식을 토대로 기본 과정만 해봤습니다.)

우선 WinDBG 설치합니다.

아래 사이트에서 다운로드가 가능합니다.

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

 

대충 이렇게 생겼습니다.



먼저 “File->Symbol File Path” 메뉴를 선택 심볼 파일의 위치를 지정합니다. 이때 Microsoft 심볼과 개발한 프로젝트의 심볼이 있는 위치를 “;”으로 구분하여 입력합니다.

Microsoft 심볼 경로 : SRV*DownstreamStore*http://msdl.microsoft.com/download/symbols


다음 “File->Open Crash Dump” 메뉴를 선택한 생성된 심볼 파일을 엽니다

그럼 다음과 같은 화면이 나타납니다.


명령어나 이런건 아직 모르겠구요 하단 텍스트 박스와 다음과 같이 입력합니다.

!analyze -v

 

그럼 아래와 같이 훌륭한 정보들이 나옵니다.

좋은정보가 되셨다면 아래 한번 클릭해주세요^^


댓글