1. 程式人生 > >c++ 程式崩潰的除錯和解決方法

c++ 程式崩潰的除錯和解決方法

程式崩潰是我以前很頭疼的問題,尤其是有時出現,有時不出現的問題,除錯也抓不到,這種清空我們通常是通過在exe程式崩潰時生成dump檔案來定位的;

首先在程式碼中 

main.cpp中定義函式:

LONG WINAPI UnhandledExceptionFilter_SpawDmp(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
    TCHAR strDumpFile[512] = { 0 };
    _tcscpy(strDumpFile, _T("faceVerify.dmp"));
    HANDLE   hFile = CreateFile(strDumpFile, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile != INVALID_HANDLE_VALUE)
    {
        MINIDUMP_EXCEPTION_INFORMATION   ExInfo;

        ExInfo.ThreadId = ::GetCurrentThreadId();
        ExInfo.ExceptionPointers = ExceptionInfo;
        ExInfo.ClientPointers = NULL;

        //   write   the   dump
        BOOL   bOK = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL);
        CloseHandle(hFile);
    }
    ::PostThreadMessage(GetCurrentThreadId(), WM_QUIT, 0, 0);
    return EXCEPTION_EXECUTE_HANDLER;
}

 

其中faceVerify.dmp就是生成dump的檔名;

在main()函式中呼叫:

SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)UnhandledExceptionFilter_SpawDmp);

 

這樣就設定了在崩潰時回掉該函式,生成dmp檔案;

 

好了,在程式出現崩潰的時候,到目錄下找到faceVerify.dmp這個檔案,雙擊開啟,呼叫vs開啟調式

點選僅限本機除錯,就能定位到程式碼中的第幾行了;