前言
上一篇,通过研究,可以定位到函数,本篇进一步优化,没有行数,程序较为复杂的时候,就无法定位,所以进一步定位。
本篇做了qBreakpad的研究,但是没有成功,过程也还是填出来,后来突然注意到gdb出现行数的方法,并通过了几轮测试以及实战,确实可以定位到行数,所以为了大家方便,把国企麒麟上的Qt崩溃方法分享出来。
本篇文章比较长,就不分篇了,同时还做了专项测试。
注意
阅读者如果一开始有点懵,可能先要看先大致扫一下:《麒麟系统开发笔记(十):在国产麒麟系统上使用gdb定位崩溃异常方法流程以及测试Demo》,本篇也是解决上一篇探讨的遗留问题(只定位了函数,未定位代码行号)。
使用gdb定位Qt的release(国产麒麟系统)
步骤一:修改上一篇demo的pro配置
(这里是上一篇的demo,只关注红框的即可)
步骤二:重新编译调试还是没有行号
与没有-g的时候没有啥区别。
步骤三:多加几层调用追加堆栈测试
修改下代码:
测试:
还是没有堆栈信息:
步骤四:怀疑是release版本,改为debug测试
改为debug版本,也没有:
不清楚原因,这里博主就没有深究了
步骤五:路回峰转,重启gdb,成功定位
研究qBreakpad去了,但是qBreakpad也入深坑了,在爬坑的时候,突然注意到gdb的bt指令,所以研究了个把小时qBreakpad又折回来继续了。
至此,出现了行号:
配置调试发布专项测试
为了确认最简单的方式,所以进行测试:
DEFINES += QT_NO_DEBUG_OUTPUT
DEFINES += QT_NO_WARN_OUTPUT
QMAKE_CXXFLAGS += -g
#QMAKE_CXXFLAGS += -g3
测试:debug版本,无-g,不屏蔽qt打印输出
测试:debug版本,有-g的,不屏蔽qt打印输出
有行号,行号跟函数在同一行。
测试:debug版本,有-g的,屏蔽qt打印输出
有行号,行号跟函数在同一行。
测试:release版本,有-g/-g3,有qt屏蔽打印输出
#DEFINES += QT_NO_DEBUG_OUTPUT
#DEFINES += QT_NO_WARN_OUTPUT
QMAKE_CXXFLAGS += -g
#QMAKE_CXXFLAGS += -g3
还试了下-g3:
定位了函数,不定位行号。
测试:release版本,有-g/-g3,未屏蔽qt打印输出
所以,最终发现是不能屏蔽qt打印输出的,不然是没有的,跟release或者debug没有关系(没有去论证debug下屏蔽qt打印输出了)
测试:release版本,无-g,未屏蔽qt打印输出
所以,无-g也不行
模拟实战
先加了一句代码:
取消屏蔽qt打印,加上-g:
使用release编译后,运行崩溃:
定位coredump文件:
然后使用gdb的方法:
这里得行是qlist.h的行号,不是我们代码的行号,所以下标错误估计就这样了。可以判断出,越界也是最后某个地方调用指针导致错误,所以越界当时是不会有问题,当越界在用越界调用的就把出错的指针调用出行数打出来。
下面试试指针错误:
专项测试结论
入坑
入坑一:gdb不出现行数
问题
Gdb调试不出现行数
原因
- 原因1:release与debug问题
- 原因2:-g问题
- 原因3:是否屏蔽qt打印问题
1+2+3,导致情况多种,花了不少时间定位
解决
进行了专项测试论证,查看“专项测试论证”。
qBreakpad(此方法未通,贴出来参考,有兴趣的读者可以继续往下走)
qBreakpad下载地址:https://github.com/buzzySmile/qBreakpad
git clone --recursive https://github.com/buzzySmile/qBreakpad.git
好像下下来有点问题,最后还是手动下载zip包了:
qBreakpad依赖breakpad和lss
下不下来,另外找把
breakpad下载地址:https://github.com/google/breakpad
(最新版报错),下载v2021.08.09版本
lss:https://github.com/ithaibo/linux-syscall-support
下载来:
编译qBreakpad库
步骤一:下载解压
步骤二:复制改名依赖库
复制过去并改名:
改完后(先删除已经存在的):
步骤三:使用qtcreator打开qBreakpad编译
步骤四:解决错误“undefined reference to `google_breakpad::PEFile::TryGetDebugInfo(xxxx”,继续编译
怀疑是版本问题,降低版本试试:
如下,下载解压后替换:
步骤五:解决错误“*** No rule to make target ‘xxx/minidump_file_writer.cc’, needed by ‘_build/obj/minidump_file_writer.o’. Stop.”
“*** No rule to make target ‘…/…/qBreakpad-master/third_party/breakpad/src/client/minidump_file_writer.cc’, needed by ‘_build/obj/minidump_file_writer.o’. Stop.”
那岂不是要降低qBreakpad的版本?试一试
至此,突然发现gdb的bt,所以这边停止了。