불측정 다수가 사용하는 소프트웨어를 개발하다 보면 그 환경이 너무나도 다양해서 예상치 못한 에러들이 많이 발생하곤 합니다.
이러한 에러 중 try... catch... 로도 잡아내지 못하는 메모리 포인트 오류가 발생했을 때 미니덤프 파일을 생성시켜 이 파일을 이용하여 어디서 프로그램이 오류가 났는지 알 수 있으며 상황에 따라 다르겠지만 Call Stack 과 변수값까지도 알 수 있습니다.
예기치 않은 메모리 오류 발생시 다음의 코드로 미니 덤프를 생성하도록 할 수 있습니다.
덤프파일을 받아서 디버기을 하려면 덤프파일이 만들어지는 당시의 exe와 pdb 파일이 있어야 합니다.
소스를 전혀 안고쳤어도 빌드를 하게 되면 디버깅이 되지 않으므로
덤프파일 수집을 위한 테스트 버전을 배포할 때 해당 exe와 pdb 를 반드시 백업받으시기 바랍니다.
해당 exe와 pdb 그리고 덤프파일이 같은 폴더에 있는 상태에서 덤프파일을 더블클릭하면
어디서 프로그램이 즉었는지 알 수 있습니다.
이러한 에러 중 try... catch... 로도 잡아내지 못하는 메모리 포인트 오류가 발생했을 때 미니덤프 파일을 생성시켜 이 파일을 이용하여 어디서 프로그램이 오류가 났는지 알 수 있으며 상황에 따라 다르겠지만 Call Stack 과 변수값까지도 알 수 있습니다.
예기치 않은 메모리 오류 발생시 다음의 코드로 미니 덤프를 생성하도록 할 수 있습니다.
#include <Dbghelp.h> LONG __stdcall Exception_Minidump(_EXCEPTION_POINTERS* pExceptionInfo) { TCHAR fileName[MAX_PATH] = {0,}; _tcscpy(fileName, _T("C:\\mydump.dmp")); HANDLE hProcess = GetCurrentProcess(); DWORD dwProcessID = GetCurrentProcessId(); HANDLE hFile = CreateFile(fileName, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); MINIDUMP_EXCEPTION_INFORMATION eInfo; eInfo.ThreadId = GetCurrentThreadId(); eInfo.ExceptionPointers = pExceptionInfo; eInfo.ClientPointers = FALSE; MiniDumpWriteDump(hProcess, dwProcessID, hFile, MiniDumpNormal, pExceptionInfo ? &eInfo : NULL, NULL, NULL); TCHAR temp[256] = {0,}; wsprintf(temp, _T("Exception Code 0x%08x arised !!"), pExceptionInfo->ExceptionRecord->ExceptionCode); MessageBox(NULL, temp, fileName, MB_OK); return EXCEPTION_EXECUTE_HANDLER; } BOOL CMyApp::InitInstance() { #ifndef _DEBUG SetUnhandledExceptionFilter(Exception_Minidump); #endif } |
덤프파일을 받아서 디버기을 하려면 덤프파일이 만들어지는 당시의 exe와 pdb 파일이 있어야 합니다.
소스를 전혀 안고쳤어도 빌드를 하게 되면 디버깅이 되지 않으므로
덤프파일 수집을 위한 테스트 버전을 배포할 때 해당 exe와 pdb 를 반드시 백업받으시기 바랍니다.
해당 exe와 pdb 그리고 덤프파일이 같은 폴더에 있는 상태에서 덤프파일을 더블클릭하면
어디서 프로그램이 즉었는지 알 수 있습니다.
'C / C++ / Win32 / MFC' 카테고리의 다른 글
CFileDialog 에서 "내컴퓨터"를 초기 폴더로 지정하기 (0) | 2009.06.05 |
---|---|
Excel 파일을 SQLite로 변환 (0) | 2009.05.20 |
IWebBrower의 DocumentComplete 이벤트에서 마지막 호출인지 검사하기 (0) | 2009.04.21 |
비스타에서 Visual Studio 2003의 Find in Files 기능 사용하기 (0) | 2009.04.20 |
왜 C/C++인가? (2) | 2009.04.20 |