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開啟調式
點選僅限本機除錯,就能定位到程式碼中的第幾行了;