How to write a sample code that will crash and produce dump file?

后端 未结 9 1433
礼貌的吻别
礼貌的吻别 2020-12-12 23:15

I started learned windbg and I found this good post How to use WinDbg to analyze the crash dump for VC++ application?

Now I want to follow the instructions and do it

9条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-12 23:25

    #include 
    #include 
    
    void make_minidump(EXCEPTION_POINTERS* e)
    {
        auto hDbgHelp = LoadLibraryA("dbghelp");
        if(hDbgHelp == nullptr)
            return;
        auto pMiniDumpWriteDump = (decltype(&MiniDumpWriteDump))GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
        if(pMiniDumpWriteDump == nullptr)
            return;
    
        char name[MAX_PATH];
        {
            auto nameEnd = name + GetModuleFileNameA(GetModuleHandleA(0), name, MAX_PATH);
            SYSTEMTIME t;
            GetSystemTime(&t);
            wsprintfA(nameEnd - strlen(".exe"),
                "_%4d%02d%02d_%02d%02d%02d.dmp",
                t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond);
        }
    
        auto hFile = CreateFileA(name, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
        if(hFile == INVALID_HANDLE_VALUE)
            return;
    
        MINIDUMP_EXCEPTION_INFORMATION exceptionInfo;
        exceptionInfo.ThreadId = GetCurrentThreadId();
        exceptionInfo.ExceptionPointers = e;
        exceptionInfo.ClientPointers = FALSE;
    
        auto dumped = pMiniDumpWriteDump(
            GetCurrentProcess(),
            GetCurrentProcessId(),
            hFile,
            MINIDUMP_TYPE(MiniDumpWithIndirectlyReferencedMemory | MiniDumpScanMemory),
            e ? &exceptionInfo : nullptr,
            nullptr,
            nullptr);
    
        CloseHandle(hFile);
    
        return;
    }
    
    LONG CALLBACK unhandled_handler(EXCEPTION_POINTERS* e)
    {
        make_minidump(e);
        return EXCEPTION_CONTINUE_SEARCH;
    }
    
    int main()
    {
        SetUnhandledExceptionFilter(unhandled_handler);
    
        return *(int*)0;
    }
    

提交回复
热议问题