Seize the day

POST : SDP for win32/디버깅

크래시 핸들러

프로그램이 크래시 되는 것은 좋지 않은 인상을 남긴다. 개발자라면 크래시가 나서 프로그램이 비 정상 종료되는 버그를 가장 경계한다. 아무리 견고하게 프로그램을 작성하더라도 완벽할 수는 없고, 특히 굉장히 낮은 확율의 타이밍 오류로 인한 크래시는 Q/A 단계에서 찾기가 어렵다. 크래시 핸들러를 동작시켜서 크래시가 났을 때의 쓰레드나 콜 스택, 메모리 값을 남기는 덤프파일을 확보하는 것이 중요해 졌다. 


덤프 파일을 분석하기 위해서 배포단계마다 중요 모듈의 PDB 파일을 매리 확보해 두어야 한다. 빌드 자동화 스크립트에서는 최종 deploy폴더에 PDB 파일에 버전넘버를 붙여서 복사해 두고 있다. EasyRegistry 프로젝트를 빌드하면 EasyRegistry(1.0.0.13)_2013-09-11.pdb 라는 파일이 남겨진다. 


유관부서나 Q/A 단계에서 테스트 단계에서 나는 덤프 파일은 자동으로 프로젝트명_모듈_버전_날짜_.DUMP 형식으로 바탕화면에 저장이 된다. 미니덤프 파일이므로 개발자에게 메일로 전달하면 끝이다. 바탕화면에 덤프 파일을 남기는 이유는 파일 쓰기 권한 문제도 있지만 사용자나 테스터나 덤프 파일을 찾기 쉽도록 하기 위함이다. 


사용자 단계에서 발생하는 크래시는 서버에 자동으로 DUMP 파일을 업로드하고 크래시 정보를 서버에 남긴다. 크래시 파일을 메일로 보내달라고 안내를 하더라도 실제로 수고스럽게 메일을 쓰는 사용자는 거의 없다.  크래시 덤프 파일 자체에는 아무런 개인정보도 포함되어 있지 않기 때문에 자동으로 업로드하고 개발자가 덤프파일과 PDB 파일을 이용하여 크래시가 나는 코드와 오류를 파악하게 된다. 


src/base/CrashHandler.h, cpp 파일을 참고 

    dfx::InstallCrashHandler(L"EasyRegistry", L"ER", PROJ_VERSION, 

        L"http://mdiwebma.com/easyregistry/upload_dump.php?proj=ER");


오류코드

void CToolbarDlg::OnAbout()

{

int* a = NULL;

*a = 1;

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}


크래시 발생시





서버에남겨지는 파일은

 ER_1_0_0_13_Crash_(code_0xC0000005_addr_0x0043A469)_in_EasyRegistry_exe_9_11_21_48_40.dmp

와 같다. 프로젝트명 버전 오류코드와 주소 발생모듈의 이름 날짜 정보를 가지고 있다. 


서버로그에는 콜스택 정보를 포함하여 가능한 많은 정보를 기록한다. 

http://mdiwebma.com/easyregistry/logging_view.php?proj=ER

2013-09-11 [ EasyRegistry.exe ] 1.0.0.13 , 0x0043A469 (0) CRASH : crash in EasyRegistry.exe (code: 0xC0000005, address: 0x0043A469)

C:\Users\kimdaejeong\Desktop\ER_1_0_0_13_Crash_(code_0xC0000005_addr_0x0043A469)_in_EasyRegistry_exe_9_11_21_48_40.dmp Callstack: EasyRegistry.exe!CToolbarDlg::OnAbout [0x0043A469+41] EasyRegistry.exe!_AfxDispatchCmdMsg [0x0044463F+69] (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\cmdtarg.cpp:82) EasyRegistry.exe!CCmdTarget::OnCmdMsg [0x0044484E+284] (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\cmdtarg.cpp:381) EasyRegistry.exe!CDialog::OnCmdMsg [0x0044777E+29] (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dlgcore.cpp:85) EasyRegistry.exe!CWnd::OnCommand [0x0044CDA2+146] (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp:2363) EasyRegistry.exe!CWnd::OnWndMsg [0x0044D7CF+54] (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp:1769) EasyRegistry.exe!CWnd::WindowProc [0x00448DF8+36] (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp:1755) EasyRegistry.exe!AfxCallWndProc [0x0044C1FD+154] (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp:240) EasyRegistry.exe!AfxWndProc [0x0044C28C+54] (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp:402) EasyRegistry.exe!gapfnScSendMessage [0x75D8C4E7+463] EasyRegistry.exe!gapfnScSendMessage [0x75D8C5E7+719] EasyRegistry.exe!gapfnScSendMessage [0x75D8CC19+2305] EasyRegistry.exe!DispatchMessageW [0x75D8CC70+15] EasyRegistry.exe!AfxInternalPumpMessage [0x00445391+64] (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp:183) EasyRegistry.exe!CWnd::RunModalLoop [0x0044AD21+197] (f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp:4386) 



배포시 dbghelp.dll 파일도 설치 폴더에 같이 포함시켜야 한다. 윈도우 XP같은 경우 낮의 버전의 dll이 시스템에 설치되어 있어서 이런경우 제대로 덤프파일을 생성하지 못 할 수도 있다. 




오류가 났을 때 크래시 주소를 기준으로 가장 많이 발생한 순서로 확인이 가능한다. 


mysql> select file, count(file) as _c from logging where version ='2.0.0.1086'  group by file order by _c;


| 0x0051B74D |   2 |

| 0x00430053 |   2 |

| 0x0064009F |   2 |

| 0x005C0002 |   2 |

| 0x004493D1 |   2 |

| 0x00517397 |   3 |

| 0x0050A76A |   3 |

| 0x00650088 |   3 |

| 0x005A8345 |   3 |

| 0x006100A3 |   3 |

| 0x0064CB21 |   3 |

| 0x00640061 |   4 |

| 0x00401FCF |   4 |

| 0x00512504 |   4 |

| 0x0050A768 |   4 |

| 0x0058A637 |   5 |

| 0x00448D52 |   5 |

| 0x0052D240 |   5 |

| 0x0046043B |   5 |

| 0x00401A96 |   7 |

| 0x0049007B |   7 |

| 0x0063664A |   7 |

| 0x004772BA |   7 |

| 0x00427857 |   7 |

| 0x0050AC9C |   8 |

| 0x00440C69 |   8 |

| 0x00538BEF |   8 |

| 0x00513361 |   8 |

| 0x0051B713 |   8 |

| 0x0064CB04 |   8 |

| 0x0050A8B0 |  10 |

| 0x00406FC1 |  11 |

| 0x00640096 |  11 |

| 0x0061008B |  12 |

| 0x00511F76 |  15 |

| 0x006177DC |  19 |

| 0x00401DF5 |  19 |

| 0x0050F22E |  19 |

| 0x0046E526 |  22 |

| 0x00401DF7 |  25 |

| 0x00440C10 |  33 |

| 0x005E8CD7 |  40 |

| 0x00401F44 |  47 |

| 0x00401DF9 |  57 |

| 0x00401F42 |  67 |

| 0x0043E42F |  72 |

| 0x005ADB9F |  84 |

| 0x00515241 |  84 |

| 0x00475887 |  93 |

| 0x00505E2B | 123 |

| 0x00000000 | 151 |

| 0x00572AB1 | 227 |

| 0x005E8CCF | 385 |

+------------+-----+

162 rows in set (0.12 sec)






top

posted at

2013. 9. 11. 21:59


CONTENTS

Seize the day
BLOG main image
김대정의 앱 개발 노트와 사는 이야기
RSS 2.0Tattertools
공지
아카이브
최근 글 최근 댓글
카테고리 태그 구름사이트 링크