在C++應用程式中設定生成dump並使用VS進行除錯
阿新 • • 發佈:2018-11-10
首先,包含標頭檔案
#include "Windows.h"
#include "DbgHelp.h"
其次,在程式碼中新增這兩個函式
int GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExceptionPointers, PWCHAR pwAppName) { BOOL bOwnDumpFile = FALSE; HANDLE hDumpFile = hFile; MINIDUMP_EXCEPTION_INFORMATION ExpParam; typedef BOOL(WINAPI * MiniDumpWriteDumpT)( HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION ); MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL; HMODULE hDbgHelp = LoadLibrary(L"DbgHelp.dll"); if (hDbgHelp) pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump"); if (pfnMiniDumpWriteDump) { if (hDumpFile == NULL || hDumpFile == INVALID_HANDLE_VALUE) { //TCHAR szPath[MAX_PATH] = { 0 }; TCHAR szFileName[MAX_PATH] = { 0 }; //TCHAR* szAppName = pwAppName; TCHAR* szVersion = L"v1.0"; TCHAR dwBufferSize = MAX_PATH; SYSTEMTIME stLocalTime; GetLocalTime(&stLocalTime); //GetTempPath(dwBufferSize, szPath); //wsprintf(szFileName, L"%s%s", szPath, szAppName); CreateDirectory(szFileName, NULL); wsprintf(szFileName, L"%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp", //szPath, szAppName, szVersion, szVersion, stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond, GetCurrentProcessId(), GetCurrentThreadId()); hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0); bOwnDumpFile = TRUE; OutputDebugString(szFileName); } if (hDumpFile != INVALID_HANDLE_VALUE) { ExpParam.ThreadId = GetCurrentThreadId(); ExpParam.ExceptionPointers = pExceptionPointers; ExpParam.ClientPointers = FALSE; pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &ExpParam : NULL), NULL, NULL); if (bOwnDumpFile) CloseHandle(hDumpFile); } } if (hDbgHelp != NULL) FreeLibrary(hDbgHelp); return EXCEPTION_EXECUTE_HANDLER; } LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo) { if (IsDebuggerPresent()) { return EXCEPTION_CONTINUE_SEARCH; } return GenerateMiniDump(NULL, lpExceptionInfo, L"test"); }
再在程式碼中註冊該功能
SetUnhandledExceptionFilter(ExceptionFilter);
如此操作之後,若應用程式在執行時發生崩潰,便會在程式當前執行目錄下產生dump檔案。
我們雙擊開啟該dump檔案,便可在VS中看到是在程式碼中哪一行發生的崩潰。
注意:一定要確保應用程式exe以及pdb檔案在該dump檔案同級目錄下。
除錯步驟:
1、設定符號路徑
選擇Microsoft 符號伺服器
,點選載入所有符號,第一次速度會有點慢。
2、設定原始碼路徑
在左側的解決方案處右鍵點選 屬性
-> 除錯原始檔
3、點選除錯即可
如果提示 無法找到除錯資訊 , 或者除錯資訊不匹配 , 無法查詢或開啟 PDB 檔案
, 說明沒有將最初生成程式的對應 .pdb
符號檔案放在除錯程式所在的目錄 , 或者 .pdb
符號檔案與當前的程式版本不匹配 ;