c++에서 unhandle exception control 하는 경우

SetUnhandledExceptionFilter() 함수에 LONG WINAPI my_top_level_filter(__in PEXCEPTION_POINTERS pExceptionPointer) 형태의 callback pointer를 전달 합니다.

SetUnhandledExceptionFilter(my_top_level_filter);

callback함수 안에서는 minidump 파일을 생성하여 write 해두면 추후 !analyze -v를 통해 쉽게 stack trace가 가능 합니다.

아래는 간단한 mini dump 예제 입니다.

MINIDUMP_EXCEPTION_INFORMATION MinidumpExceptionInformation;
PEXCEPTION_RECORD pExceptionRecord = pExceptionPointer->ExceptionRecord;
MinidumpExceptionInformation.ThreadId = ::GetCurrentThreadId();
MinidumpExceptionInformation.ExceptionPointers = pExceptionPointer;
MinidumpExceptionInformation.ClientPointers = FALSE;
HANDLE hDumpFile = ::CreateFileW(dump_filename.c_str(),
    GENERIC_WRITE, 
    FILE_SHARE_WRITE, 
    NULL, 
    CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL, NULL);

MiniDumpWriteDump(GetCurrentProcess(),
    GetCurrentProcessId(),
    hDumpFile,
    MiniDumpNormal,
    &MinidumpExceptionInformation,
    NULL,
    NULL);

::TerminateProcess(::GetCurrentProcess(), 0);