작은 프로그램을 만들어서 공유하다보면 가끔씩 빡날 때가 생기게 됩니다. 그래서 유용하게 사용되는게 미니덤프 파일인데 운영체제가 XP 라면 왓슨박사에게 말해두면 곧 잘 생기게 됩니다. 그러나 운영체제별로 구별하는 것도 여간 귀찮은 일이 아닙니다. 최대한 간편하면서도 쉽게 생성할 수 있는 방법은 아래와 같이 몇 줄을 C&P 하면 간단하게 하게 생성할 수 있습니다.
BOOL CTrusTestApp::InitInstance() { INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinAppEx::InitInstance(); CTrusTestDlg dlg; m_pMainWnd = &dlg; SetUnhandledExceptionFilter(CustomUnhandledExceptionFilter); INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: } else if (nResponse == IDCANCEL) { // TODO: } return FALSE; }위의 13 라인과 같이 MFC 다이얼로그의 DoModal() 함수 호출 직전에 예외 필터를 하나를 걸어둡니다. 그럼 크래시가 발생할 경우 위의 함수로 제어권이 넘어가게 됩니다. 그 때 아래와 같이 덤프파일을 조용히 생성하고 해당 파일을 수집하면 코드라인 수준으로 디버깅을 할 수 있습니다.
LONG WINAPI CustomUnhandledExceptionFilter(PEXCEPTION_POINTERS pExInfo) { TCHAR szPath[MAX_PATH]; GetModuleFileName(NULL, szPath, MAX_PATH); TCHAR* T = _tcsrchr(szPath, _T('.')); if ( T ) { *T = _T('\0'); } StringCchCat(szPath, MAX_PATH, _T(".dmp")); HANDLE hFile = CreateFile( szPath , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL); MINIDUMP_EXCEPTION_INFORMATION eInfo; eInfo.ThreadId = GetCurrentThreadId(); eInfo.ExceptionPointers = pExInfo; eInfo.ClientPointers = FALSE; MiniDumpWriteDump( GetCurrentProcess() , GetCurrentProcessId() , hFile , MiniDumpNormal , &eInfo , NULL , NULL ); CloseHandle(hFile); TCHAR szMessage[1024]; StringCchPrintf( szMessage , 1024 , _T("프로그램에 크래시가 발생하였습니다.\n") \ _T("아래의 경로에 원인을 추측할 수 있는 덤프파일을 생성하였습니다.\n") \ _T("덤프파일을 담당자에게 전달해주시면 크래시 현상을 제거할 수 있습니다.\n") \ _T("\n") _T("경로 : %s") , szPath ); ::MessageBox( GetDesktopWindow(), szMessage, _T("크래시 발생!"), MB_OK | MB_ICONWARNING ); return EXCEPTION_EXECUTE_HANDLER; }다만 릴리즈 할 때, 프로그램 디버깅 정보와 map, pdb 파일을 같이 생성하여 가지고 있어야 합니다.
최근 댓글