본문 바로가기

C / C++ / Win32 / MFC

미니덤프를 이용하여 디버깅하기

불측정 다수가 사용하는 소프트웨어를 개발하다 보면 그 환경이 너무나도 다양해서 예상치 못한 에러들이 많이 발생하곤 합니다.
이러한 에러 중 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 그리고 덤프파일이 같은 폴더에 있는 상태에서 덤프파일을 더블클릭하면
어디서 프로그램이 즉었는지 알 수 있습니다.