최대 1 분 소요

😢상황

  • 프로그램이 예기치 않게 종료될 때, 자동으로 메모리 덤프(.dmp) 파일을 생성하여
    나중에 문제를 분석하고 싶음
  • 수동 덤프 생성이 아닌, 코드로 덤프를 남기고 싶음

🛠️해결법

1. 덤프 파일 생성 코드 추가

C++ 코드에서 MiniDumpWriteDump를 호출하여 .dmp 파일 생성:

#include <windows.h>
#include <DbgHelp.h>
#include <filesystem>
#include <regex>
#include <sstream>

namespace fs = std::filesystem;

// 덤프 생성 함수
void CreateMiniDump(EXCEPTION_POINTERS* pep)
{
    HANDLE hFile = CreateFile(_T(".\crash\CrashDump.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile != INVALID_HANDLE_VALUE)
    {
        MINIDUMP_EXCEPTION_INFORMATION mdei;
        mdei.ThreadId = GetCurrentThreadId();
        mdei.ExceptionPointers = pep;
        mdei.ClientPointers = FALSE;

        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mdei, NULL, NULL);
        CloseHandle(hFile);
    }
}

// 처리되지 않은 예외 핸들러
LONG WINAPI MyUnhandledExceptionFilter(EXCEPTION_POINTERS* pExceptionInfo)
{
    CreateMiniDump(pExceptionInfo);
    MessageBoxA(hWnd, msg.str().c_str(), "예상치 못한 종료", MB_OK | MB_TOPMOST | MB_ICONERROR);
    return EXCEPTION_EXECUTE_HANDLER;
}

💡 프로그램 진입 시 SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);를 등록해야 작동합니다.


2. .dmp 파일 분석 방법 (요약)

생성된 .dmp 파일은 Visual Studio 또는 WinDbg로 열어 분석할 수 있습니다.
(자세한 분석 방법은 .dmp 파일을 이용한 디버깅 방법 문서를 참고)


정리: 왜 이게 효과 있었는가?

  • 프로그램이 크래시할 때 수동 개입 없이 자동으로 덤프와 로그를 남길 수 있음
  • 덤프 파일은 문제 재현이 어려운 크래시 분석에 필수적인 자료가 됨
  • MiniDumpWriteDump 함수는 Windows 기본 API로, 추가 설치 없이 사용 가능