首先,包含頭文件
#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
符號文件與當前的程序版本不匹配 ;