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
增加三个注册表项(如果不存在这三项)
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设置
符号路径:把步骤5生成的pdb文件所在目录及微软符号服务器加进去,使用说明见:Windows 调试器的符号路径 - Windows drivers | Microsoft Docs
源文件路径:源代码文件夹
可执行文件路径:可执行文件路径(这个选择具体的exe文件报错,只能选exe文件所在文件夹)
注:这三种路径设置,每个串口点击OK后会在主窗口中显示参数设置状态,如果有问题会报Error,可根据提示进行修改
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的错误捕捉)
Windows下使用Windbg处理Qt崩溃转储dmp相关推荐
- Windows下生成dump文件的三种方式
文章目录 前言 一.什么是dump文件? 概述 dump分类 内核模式Dump 用户模式Dump 二.dump生成方式 实现方法 方法一:修改注册表 参数说明 方法二:生动创建转储文件 方法三:通过代 ...
- windows崩溃转储文件
在默认情况下,所有的Windows系统都被设置为:当系统崩溃时,系统总是试图记录下有关当前系统的状态的信息.你可以通过用户界面看到这些设置,做法是,打开控制面板中的System工具,然后在Sy ...
- Google Breakpad 在 windows下捕获程序崩溃报告
一.简述 Google breakpad是一个非常实用的跨平台的崩溃转储和分析模块,支持Linux.mac.solaris.windows. 通俗一点来讲,我们可以借助Google breakpad来 ...
- Windows平台崩溃转储系统crashrpt的使用
概述 CrashRpt 是一个免费的.轻量级的开源错误报告库开源库,旨在拦截C++程序中的异常,收集有关崩溃的技术信息并通过互联网向软件供应商发送错误报告,用于在 Microsoft Visual S ...
- Windows下Qt程序打包
Windows下Qt程序打包 将windeployqt.exe 目录添加到系统环境变量 windeployqt.exe目录如下: 命令行打包 1.打开命令行 2.执行打包命令 windeployqt ...
- Qt 程序在 Windows 下的发布
「博客搬家」 原地址: CSDN 原发表时间: 2016-06-04 本文讨论在 Windows 平台下编译成功的 Qt 程序,如何在未配置 Qt 开发环境的 Windows 平台下独立运行的方法. ...
- 在Windows下搭QT编程环境
因为工作需要,要用到QT做UI,今天周末我决定来公司将QT环境搭起来. 在之前网上找了很多别人的经验,大概了解了在Windows下拾建的步骤: 1. 要有VS2005的工具,当然我机子上本来就有VS2 ...
- QT + OpenCV + MinGW 在windows下配置开发环境
由于研究项目需要,最近开始接触C++界面设计,关于"QT + OpenCV + MinGW在windows下配置开发环境"着实让人头疼,单次配置时间相当长,也十分不容 ...
- Linux 下重新编译Windows下生成的Qt工程
原址:https://blog.csdn.net/Fanpei_moukoy/article/details/21613703 以下内容亲测通过 其实qt才是真正的跨平台,java简直太搞笑了,假跨平 ...
最新文章
- [技巧]使用Xcode集成的HeaderDoc自动生成注释和开发文档
- ASP.NET 2.0中CSS失效解决方案
- 008_CSS属性选择器
- 博客搜索引擎索引博文数量分析与评估
- 三阶魔方魔方公式_观看此魔方的自我解决
- 配置linux系统自带apache+php+mysql
- 项目经理常见的沟通坏习惯
- 微软发布 Azure 物联网安全中心;阿里巴巴在美申请专利,以实现跨区块链统一管理;Google利用足球训练下一代人工智能……...
- QScrollArea 详解
- 自然语言处理系列-1.什么是NLP?
- Android Fragment-APP调用其他APP中的Fragment 1
- J-Octa 使用MD和MO/DFT计算相对介电常数
- q讯家园看加密空间 官方免费版
- 5款Windows系统下的桌面管理软件
- 17个改变世界的数学公式!
- openerp 打印报表pdf中文乱码解决办法
- 104届广交会秋交会展位(摊位)联营参展函 (广交会展位合作)
- 教你如何写好一篇专利申请?
- android qq底部菜单栏,怎么关闭手机QQ底部导航栏的“看点”?
- 分布式与集群的区别?