Windows下使用Windbg处理Qt崩溃转储dmp

目录

1.简介

2.开发环境

3.生成dump文件

3.1修改注册表(方式1)

3.2修改注册表(方式2)

3.3修改代码,设置回调函数(方式3)

4.修改pro文件

5.生成pdb

5.1下载cv2pdb工具

5.2使用cv2pdb工具生成pdb文件

6.Windbg调试dmp

6.1设置

6.2解析dmp文件


1.简介

崩溃转储时在软件崩溃时,把堆栈信息保存到日志,便于定位崩溃位置(未深入研究,这是我自己的理解)

2.开发环境

Win10,QtCreator4.10.0,Qt5.12.5,MinGW7.3.0(Qt、QtCreator、MinGW是Qt5.12.5安装包自带的),VS2015(编译器是MinGW,VS2015仅作为步骤5中pdb转换工具的运行环境)

3.生成dump文件

3.1修改注册表(方式1)

注册表定位到以下节点:\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

增加三个注册表项(如果不存在这三项)

Auto:1开始  0停止
Debugger:"D:\Windows Kits\10\Debuggers\x64\windbg.exe"是调用产生dump的程序可以用windbg
			也可以用vs自带的调试工具C:\Windows\System32\vsjitdebugger.exe
				".dump -ma D:\dumpWindbg\CrashDump.dmp"这句是使用windbg产生dmp的命令
图中数据("D:\Windows Kits\10\Debuggers\x64\windbg.exe" -p %ld –c ".dump -ma D:\dumpWindbg\CrashDump.dmp" -e %ld –g)

(默认值:"D:\software\windbg\install\windbg.exe" -p %ld -e %ld)---直接启动WinDbg调试

UserDebuggerHotKey:快捷键创建BreakPoint,详见https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000-server/cc939487(v=technet.10)

注:我用的方式2,所以这个没法截图,与方式2操作方法相同。

3.2修改注册表(方式2)

注册表定位到以下节点:\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps

增加三个注册表项(如果不存在这三项)

Windows下使用Windbg处理Qt崩溃转储dmp_第1张图片

DumpCount:文件数量
DumpFolder:存储位置
DumpType:dmp文件类型 0:custom 1:mini 2:full

方式1和方式2对比说明(该段摘抄自网络):
通过实际测试(win10 环境)方式 1 和方式 2 互斥:也就是说两个方式同存时只有一个生效
关闭方式 1 只需将 Auto 数值改为 0,关闭方式 2 只需将数量 DumpCount 改为 0
方式 1 和 2 都不需要写代码,比较方便。
方式 1 文件名自己用 windbg 命令(我还不熟悉,只写了这个,后续知道了增加一个可变的名字)
方式 2 文件名会以程序名加进程号出现(应用程序名称全称。进程号.dmp)

1.未进行任何修改,也会在C:\Users\XXX\AppData\Local\CrashDumps目录下生成dmp文件,但是不清楚该默认dmp文件的生成参数,如DumpType参数,该dmp文件与修改注册表后生成的dmp文件有什么区别,没深入研究,可自行尝试。

2.如果项目使用了EasyLoggging++,需要在pro文件中取消EL对错误的捕捉,把下面这一行注释掉

ELPP_FEATURE_ALL \

3.3修改代码,设置回调函数(方式3)

这部分我就不写了,因为网上试了三四种代码实现的方式,都没有成功生成dmp文件,最终用的方式2

贴几个网上的实现代码(不保证成功,反正我没成功):

qt mingw 创建dump 并查找crash 出错行_学之知之的博客-CSDN博客(这个网址的方法在pro文件中少加了LIBS += -lDbgHelp)

使用QTCreator编程时,如何利用dmp文件定位程序奔溃_thequitesunshine007的博客-CSDN博客

4.修改pro文件

如果在步骤3中使用的是修改代码的方式,则已经修改了pro文件,可跳过步骤4。

如果在步骤3中使用的是修改注册表的方式,就需要在pro文件中加入以下内容,目的是在release版本中加入调试信息:

CONFIG +=debug_and_release
CONFIG(release,debug|release){
QMAKE_LFLAGS_RELEASE += /MAP /INCREMENTAL:NO /DEBUG /opt:ref
QMAKE_CFLAGS_RELEASE += -O2 -MD /Zi
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
}
#只在release使用,否则如果使用了其他错误捕捉的库,编译时会提示错误捕捉重定义

:修改pro文件后,需要清理项目,重新构建

5.生成pdb

使用Windbg调试dmp文件需要设置符号路径,如果只设置了微软符号服务器的内容,则解析dmp文件时无法定位到具体崩溃的代码所在行,因此还需要设置工程的符号路径,生成工程符号文件的过程如下:

5.1下载cv2pdb工具

下载链接:

项目网址:https://github.com/rainers/cv2pdb(页面右侧有最新的release版本下载链接,github页面改版不负责修改)

V0.38下载链接(点击该链接可直接下载):https://ci.appveyor.com/api/projects/rainers/visuald/artifacts/cv2pdb.exe?job=Environment%3A%20os%3DVisual%20Studio%202015%2C%20VS%3D14%2C%20APPVEYOR_BUILD_WORKER_IMAGE%3DVisual%20Studio%202015

如果无法访问GitHub,可在这下载:exe生成pdb符号文件工具-桌面系统文档类资源-CSDN下载

5.2使用cv2pdb工具生成pdb文件

使用该版本(V0.38)工具需VS2015环境,具体需要哪个组件未深入研究,我直接装的VS2015(安装的组件,只选了编程语言 - Visual C++,而且未勾选XP支持,因为我不需要开发XP兼容的程序)

cmd或powershell运行以下命令,即可生成pdb

cv2pdb debugger.exe

6.Windbg调试dmp

可以用Windbg或VS,网上还有用QtCreator调试的方法,不过我没有试成功,我用的是Windbg。

QtCreator调试dmp(可自行尝试,我用这种方法说dmp文件格式不对):Qt生成dump文件——release版_小黑屋1024的博客-CSDN博客_dump文件 qt

VS调试dmp可自行搜索,网上教程很多,以下为Windbg调试dmp过程

6.1设置

Windows下使用Windbg处理Qt崩溃转储dmp_第2张图片

符号路径:把步骤5生成的pdb文件所在目录及微软符号服务器加进去,使用说明见:Windows 调试器的符号路径 - Windows drivers | Microsoft Docs

源文件路径:源代码文件夹

可执行文件路径:可执行文件路径(这个选择具体的exe文件报错,只能选exe文件所在文件夹)

:这三种路径设置,每个串口点击OK后会在主窗口中显示参数设置状态,如果有问题会报Error,可根据提示进行修改

Windows下使用Windbg处理Qt崩溃转储dmp_第3张图片

Windows下使用Windbg处理Qt崩溃转储dmp_第4张图片

Windows下使用Windbg处理Qt崩溃转储dmp_第5张图片

6.2解析dmp文件

Windbg,File - Open Crash Dump,选择dmp文件打开,执行命令

!analyze -v

进行dmp文件解析,可参考:

windbg分析崩溃dmp_snowings555的博客-CSDN博客_windbg分析崩溃

windbg使用超详细教程(我是新手,大佬轻虐) - 知乎

参考:

如何使QT的Release模式可调试(Windows)_itas109的专栏-CSDN博客_qt release进行调试(pro文件中的参数介绍)

windows程序异常产生dump文件(两种注册表和写代码三种方式实现)_hhl_work的博客-CSDN博客_dump文件 注册表(生成dmp文件的三种方式)

windows appcrash 注册表配置 dump生成_编程拾掇-CSDN博客(使用VS和Windbg调试dmp文件的过程介绍)

Qt 利用 dmp 文件进行调试_..-CSDN博客(使用了EasyLogging++要取消el的错误捕捉)

你可能感兴趣的:(C++,Qt,崩溃转储,Windows,Windbg)