C++ 使用PDB Dump調試
程序如果發給客戶在生產環境下發生了崩潰,往往很難定位問題,利用PDB + Dump可以快速的幫助我們定位問題。本文的方法在使用Qt + MSVC編譯器時同樣可用。
1. 生成PDB文件。
vs在生成debug版程序時會自動生成PDB文件,release版可能不會生成,在工程名點擊右鍵——屬性——鏈接器——調試。在生成調試信息欄選擇《生成調試信息》即可讓vs在生成Release版時也生成PDB文件。每次生成的PDB對應本次生成的exe文件,所以要保存好發給客戶的exe對應的PDB文件。
2.生成Dump文件
有多種配置方法可以生成Dump文件,有的需要在客戶的電腦上進行配置,使用起來不方便,我們這里利用SetUnhandledExceptionFilter在程序里生成Dump文件的方法。無需配置方便使用,創建一個win32控制台程序,輸入以下代碼.
#include <iostream>
#include <Windows.h>
//包含DBG調試模塊頭文件
#include <DbgHelp.h>
using namespace std;
//加載DBG模塊
#pragma comment(lib,"DbgHelp.lib")
// 創建Dump文件
void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS* pException) {
HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
//Dump信息
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
//寫入Dump文件內容
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
}
//處理Unhandled Exception的回調函數
long __stdcall ApplicationCrashHandler(EXCEPTION_POINTERS* pException) {
//發生未處理異常時,生成一個Test.dmp文件。
CreateDumpFile(L"Test.dmp", pException);
cout << "異常已記錄" << endl;
system("pause");
return EXCEPTION_EXECUTE_HANDLER;
}
int main()
{
//在程序開始設置未處理異常回調。
SetUnhandledExceptionFilter(ApplicationCrashHandler);
//中斷程序
_asm int 3;
std::cout << "Hello World!\n";
std::cin.get();
}
以上代碼將在程序崩潰時,生成一個Test.dmp文件。將Test.dmp與生成程序時生成的exe和pdb文件放在同一個文件夾下,用vs打開Test.dmp,然后點擊使用 僅限本機 調試,即可跳轉到出錯代碼的位置。