logo头像

技术引领生活!

Qt的mingw版本崩溃相关

msvc版本的Qt在崩溃时,会自动生成dmp文件,而mingw版本则不会,因此需要手动配置,同时最重要的是msvc具有pdb,这样既能保证c++的符号信息,又能保证崩溃时能定位到源码,于是想mingw版本肯定也可以,但是经过一番尝试,发现mingw版本生成的dmp文件中,符号信息是缺失的,因此无法定位到源码,因此只能定位到函数名,因此还是需要手动配置,以下是配置方法

效果图

效果

前置条件

使用breakpad来获取崩溃信息参加我以前的文章 崩溃收集

存在问题

release版本崩溃时,生成的dmp文件中,符号信息是缺失的, 如添加调试信息,基本上等同于开源代码(可能你还不知道debug版本的威力)

1
2
3
4
5
6
7
8
#使用下面这三句或底下三句可以在release下保留调试信息
# QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
# QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO
# QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

QMAKE_CXXFLAGS_RELEASE += -g
QMAKE_CFLAGS_RELEASE += -g
QMAKE_LFLAGS_RELEASE = -mthreads -Wl,

核心步骤

  1. 执行 objcopy 分离 debug信息

    1
    objcopy --only-keep-debug 目标.exe 调试信息.mypdb
  2. 执行 strip 去掉调试信息

    1
    strip  --strip-debug --strip-unneeded 目标.exe
  3. 执行 objcopy 将 debug文件名回填

1
objcopy --add-gnu-debuglink=调试信息.mypdb 目标.exe
  1. 加密调试信息
    将 ‘调试信息.mypdb’ 文件加密压缩后生成 ‘加密调试信息.mypdb’这里的加密算法可以自行设定

  2. 打包发布
    将 ‘加密调试信息.mypdb’ 和 ‘目标.exe’ 打包发布,这样在崩溃时,就可以获取到崩溃信息了,只需要保存好对应版本的’加密调试信息.mypdb’甚至该文件不提供

使用

  1. 解密
    对 ‘加密调试信息.mypdb’ 文件进行解密得到 ‘调试信息.mypdb’
  2. 崩溃收集
    将 ‘调试信息.mypdb’ 和 ‘目标.exe’以及 收集到的 *.dmp的崩溃信息一起放到一个文件夹中
  3. 获取崩溃点
    运行minidump_stackwalk.exe,addr2line.exe等获取崩溃代码行

参考文献

有关Qt的一些记录

mingw如何分离debug信息(deepseek)

支付宝打赏 微信打赏

您的支持是我前行的动力!