|
오늘도 버그를 잡기위해 하루종일 삽질을 한다. ㅋㅋ
물론 정말 머리가 뛰어나 천재적인 두뇌로 머리속에서 완벽한 설계를 하고 바로 코딩에 옮겨 전혀 버그없는 프로그램을 만드는게 목표이긴 하지만, 그건 정말 .. 천재라도 할 수 있을까? ㅎㅎ
예전부터 프로그램이 비정상적으로 종료가 될때 해당 정보를 저장하여 분석할 수 있으면 좋겠다라는 생각을 많이 했지만, 생각뿐이었었다.
오늘도 열씨미 개발하며 테스트를 하는데 중간에 뻣어버리는 프로그램 -_-
당최 어디서 죽는지 찾질못해 헤매는 도중 Devpia에서 Dump 제작하는 팁을 찾았다~
내용을 보니 바로 내가 찾던것~ㅎㅎㅎㅎㅎㅎ
아무생각 없이 길가다가 만원짜리 주운 심정이라고나 할까? ㅋ
아무튼 설명도 잘되있고 친전하게 소스코드까지 올려주시니 안받아볼수가 있나...
바로 받아서 해봤는데.. 오~~ 너무 좋아. 내가 찾던거야 ㅋㅋ
프로젝트에 바로 적용해봐야할듯 하다. (솔직히 버그가 좀 많다. 드러나지 않을 뿐이지 -_-)
아무튼 관련내용을 긁어다 붙여본다. ㅎ
==============================================================================================================
[MiniDump 생성]
보통 exception을 잡아내기 위해 __try~__except, try~catch를 많이 사용합니다.
__try~__except는 EXCEPTION_EXECUTE_HANDLER 등 예외 상황이 발생했을 경우 효율적인 제어가 가능합니다.
미니 덤프 시 필요한 정보를 획득하기에도 효율적이구요.
하지만 가장 큰 단점이 클래스와 같은 객체에 대한 사용이 불가능 합니다.
(제가 겪어본 바로는요;;; 아닌가요?;;;; 아니라면 저에게 가르침을 주세요~~~)
try~catch는 GetExceptionInformation 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
그럼 아래와 같이 훌륭한 정보들이 나옵니다.
좋은정보가 되셨다면 아래 한번 클릭해주세요^^ |
댓글