随笔 - 11  文章 - 0 评论 - 0 阅读 - 9101
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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,然后点击使用 仅限本机 调试,即可跳转到出错代码的位置。
仅限本机
断点

posted on   曹操是个好同志  阅读(1056)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示