C++ 使用PDB Dump調試


C++ 使用PDB Dump調試

程序如果發給客戶在生產環境下發生了崩潰,往往很難定位問題,利用PDB + Dump可以快速的幫助我們定位問題。本文的方法在使用Qt + MSVC編譯器時同樣可用。

1. 生成PDB文件。

vs在生成debug版程序時會自動生成PDB文件,release版可能不會生成,在工程名點擊右鍵——屬性——鏈接器——調試。在生成調試信息欄選擇《生成調試信息》即可讓vs在生成Release版時也生成PDB文件。每次生成的PDB對應本次生成的exe文件,所以要保存好發給客戶的exe對應的PDB文件。
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,然后點擊使用 僅限本機 調試,即可跳轉到出錯代碼的位置。
僅限本機
斷點


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM