求个网站你会感谢我的,seo手机搜索快速排名,办公空间设计案例ppt,商贸公司网站建设方案一、dump和pdb是什么 在Windows系统下#xff0c;当我们写的程序跑在客户的机器上#xff0c;因为一个bug#xff0c;导致程序崩溃#xff0c;我们该如何定位并修复这个bug呢#xff1f; 有人会说记录日志#xff0c;即便有日志#xff0c;也是不好定位的#xff0c;因…一、dump和pdb是什么 在Windows系统下当我们写的程序跑在客户的机器上因为一个bug导致程序崩溃我们该如何定位并修复这个bug呢 有人会说记录日志即便有日志也是不好定位的因为你只能推测出大概的模块或者位置无法定位到具体出错的代码行。 此时我们可以让程序崩溃后自动生成一个*.dmp文件并配合在编译该程序时生成的pdb文件来准确定位到调用堆栈、代码行上。这样很轻易就可以找到该bug。 dump文件后缀*.dmp是程序崩溃时的内存转储文件 pdb文件后缀*.pdb是程序的符号文件。
二、Breakpad与qbreakpad简介 Breakpad是由Google开发的开源跨平台崩溃报告系统用于捕获程序崩溃时的内存状态并生成轻量级minidump文件.dmp。其核心功能包括崩溃拦截、堆栈记录和寄存器状态捕获适用于C应用的多平台部署Windows/Linux/macOS。 QBreakpad是Breakpad的Qt专用封装库它将Breakpad的复杂集成简化为Qt模块提供更便捷的API和跨平台兼容性专门服务于Qt应用程序的崩溃管理。 BreakPad工作原理示意图 表达的意思就是 我们在编译的时候需要在Release版程序中生成调试信息。 使用Breakpad提供的dump_syms工具或者cv2pdb工具从release版本程序导出符号文件。 当程序崩溃时breakpad会捕捉崩溃并生成dump文件。 dump文件可以直接发送到指定服务器或者由用户手动发给开发者。 收到dump文件后结合符号文件可通过minidump_stackwalk工具或Visual Studio工具生成堆栈调用信息文件这个文件可以直接阅读定位bug。
三、开发环境说明 本人使用的开发环境如下 操作系统Windows10 IDEQt Creator4.4.1 编译器mingw53_32 Qt库Qt5.9.3
四、源码准备 我们知道qBreakpad是对Breakpad的封装所以qBreakpad的编译还依赖2套源码Breakpad、LSS。
1下载Breakpad源码
下载地址https://github.com/google/breakpad 2下载LSS源码
下载地址https://github.com/ithaibo/linux-syscall-support 3下载qBreakpad源码
下载地址https://github.com/buzzySmile/qBreakpad 4下载cv2pdb工具
下载地址
注意这个工具最好下载最新版本的作者发布本文时最新版本是cv2pdb 0.53
五、编译qBreakpad
1将Breakpad、LSS源码放入third_party目录 解压qBreakpad源码后在qBreakpad-master\third_party目录下有如下2个目录如下 分别解压Breakpad、LSS源码至breakpad和lss目录此2个目录下源码需要参与qBreakpad的编译。放置好后如下所示 2qBreakpad工程介绍 在qBreakpad源码目录下使用QtCreator打开qBreakpad.pro工程如下 demo工程下有2个演示程序program和reporter分别实现了演示生成dump文件上报dump文件的功能。 handler为静态库工程该工程封装了Breakpad直接编译此工程可生成qBreakpad.lib。 tests为一个简单的测试工程。
3编译生成qBreakpad.lib 分别在Debug、Release模式下编译handler工程生成2个版本的qBreakpad.lib静态库。
因为程序调用qBreakpad.lib时只能debug版程序链接debug版库release版程序链接release版库。debug版程序链接release版库会报错。
4编译生成demo 在program.pro文件添加下图所示内容目的是编译release版程序时生成调试信息 ############ for qBreakpad ############
# qBreakpad中需要使用到network模块
QT network# 启用多线程、异常、RTTI、STL支持
CONFIG thread exceptions rtti stl# without c11 AppKit library compiler cant solve address for symbols
CONFIG c11
macx: LIBS -framework AppKit# 启用调试信息关键
QMAKE_CXXFLAGS -g
QMAKE_CXXFLAGS_RELEASE -g
QMAKE_CFLAGS_RELEASE -g
#release在最后link时默认有-s”参数表示Omit all symbol information from the output file因此要去掉该参数
QMAKE_LFLAGS_RELEASE -mthreads -Wl,# 配置头文件搜索路径和链接库路径
INCLUDEPATH $$PWD/qBreakpad/include
CONFIG(debug, debug|release) {
LIBS -L$$PWD/qBreakpad/lib/debug -lqBreakpad
} else {
LIBS -L$$PWD/qBreakpad/lib/release -lqBreakpad
}
############ for qBreakpad ############ 在main函数添加以下内容启用崩溃时生成.dmp文件的功能 六、生成.pdb文件 将program这个demo程序编译出release版本 可见这个demo程序编译出来后体积是比较大的 然后将前面下载的cv2pdb工具解压放到目标程序同一个目录 在这个目录打开终端执行命令生成.pdb文件
cv2pdb.exe 目标程序.exe 执行成功后会在目标程序的同级目录下生成.pdb文件同时也可以看到目标程序的体积变小了 七、通过.dmp文件追踪程序崩溃的堆栈信息 运行前面生成的test.exe文件程序崩溃后会生成.dmp文件 使用Visual Studio打开.dmp文件这里以Visual Studio2022为例 点击上图中的“设置符号路径”将.pdb文件所在路径添加进去 击下图中的“使用仅限本机进行调试” 如下图所示可以看到程序崩溃时的堆栈调用情况 双击堆栈调用的行内容将源码文件路径设置一下便可查看源码及变量的实时值。 八、总结 在Windows系统下使用Mingw编译器编译出来的程序重点和难点是如何生成.pdb文件。而生成.pdb文件的重点有两方面一是在.pro文件添加-g编译参数二是使用cv2pdb工具的最新版本旧版本的cv2pdb工具可能无法生成.pdb文件这一点困扰了我好久。 如果应用程序调用了很多自己开发的动态库那么动态库的.pro文件也需要添加-g编译参数并且动态库也需要用cv2pdb工具生成.pdb文件。 最后为了方便提取多个文件的.pdb文件本人写了2个批处理脚本一个用于提取.exe文件另一个用于提取.dll文件我将脚本给出供大家参考 批量提取D:\package\bin目录下所有exe文件的pdb
echo off
echo Hello,I am processing pdb files...set OBJECT_HOMED:\packageset CV2PDB_HOME%~dp0
CHDIR /D %OBJECT_HOME%set COMPILE_BIN%OBJECT_HOME%\binecho step1: del *.pdb...
del *.pdbecho step2: create *.pdb...set FILE_TYPE_EXE*.exe
for /r %COMPILE_BIN% %%i in (%FILE_TYPE_EXE%)do ( if exist %%i %CV2PDB_HOME%/cv2pdb.exe %%i ) 批量提取D:\package\lib目录下所有dll文件的pdb
echo off
echo Hello,I am processing pdb files...set OBJECT_HOMED:\packageset CV2PDB_HOME%~dp0
CHDIR /D %OBJECT_HOME%set COMPILE_LIB%OBJECT_HOME%\libecho step1: del *.pdb...
del *.pdbecho step2: create *.pdb...set FILE_TYPE_EXE*.dll
for /r %COMPILE_LIB% %%i in (%FILE_TYPE_EXE%)do ( if exist %%i %CV2PDB_HOME%/cv2pdb.exe %%i )