赞
踩
目录
崩溃转储时在软件崩溃时,把堆栈信息保存到日志,便于定位崩溃位置(未深入研究,这是我自己的理解)
Win10,QtCreator4.10.0,Qt5.12.5,MinGW7.3.0(Qt、QtCreator、MinGW是Qt5.12.5安装包自带的),VS2015(编译器是MinGW,VS2015仅作为步骤5中pdb转换工具的运行环境)
注册表定位到以下节点:\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操作方法相同。
注册表定位到以下节点:\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps
增加三个注册表项(如果不存在这三项)
- 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 \
这部分我就不写了,因为网上试了三四种代码实现的方式,都没有成功生成dmp文件,最终用的方式2
贴几个网上的实现代码(不保证成功,反正我没成功):
qt mingw 创建dump 并查找crash 出错行_学之知之的博客-CSDN博客(这个网址的方法在pro文件中少加了LIBS += -lDbgHelp)
使用QTCreator编程时,如何利用dmp文件定位程序奔溃_thequitesunshine007的博客-CSDN博客
如果在步骤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文件后,需要清理项目,重新构建
使用Windbg调试dmp文件需要设置符号路径,如果只设置了微软符号服务器的内容,则解析dmp文件时无法定位到具体崩溃的代码所在行,因此还需要设置工程的符号路径,生成工程符号文件的过程如下:
下载链接:
项目网址: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下载
使用该版本(V0.38)工具需VS2015环境,具体需要哪个组件未深入研究,我直接装的VS2015(安装的组件,只选了编程语言 - Visual C++,而且未勾选XP支持,因为我不需要开发XP兼容的程序)
cmd或powershell运行以下命令,即可生成pdb
cv2pdb debugger.exe
可以用Windbg或VS,网上还有用QtCreator调试的方法,不过我没有试成功,我用的是Windbg。
QtCreator调试dmp(可自行尝试,我用这种方法说dmp文件格式不对):Qt生成dump文件——release版_小黑屋1024的博客-CSDN博客_dump文件 qt
VS调试dmp可自行搜索,网上教程很多,以下为Windbg调试dmp过程
符号路径:把步骤5生成的pdb文件所在目录及微软符号服务器加进去,使用说明见:Windows 调试器的符号路径 - Windows drivers | Microsoft Docs
源文件路径:源代码文件夹
可执行文件路径:可执行文件路径(这个选择具体的exe文件报错,只能选exe文件所在文件夹)
注:这三种路径设置,每个串口点击OK后会在主窗口中显示参数设置状态,如果有问题会报Error,可根据提示进行修改
Windbg,File - Open Crash Dump,选择dmp文件打开,执行命令
!analyze -v
进行dmp文件解析,可参考:
windbg分析崩溃dmp_snowings555的博客-CSDN博客_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的错误捕捉)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。