麒麟系统开发笔记(十一):在国产麒麟系统上使用gdb定位崩溃异常方法流程进阶定位代码行数及专项测试Demo
前言
上一篇,通过研究,可以定位到函数,本篇进一步优化,没有行数,程序较为复杂的时候,就无法定位,所以进一步定位。
本篇做了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,所以这边停止了。
麒麟系统开发笔记(十一):在国产麒麟系统上使用gdb定位崩溃异常方法流程进阶定位代码行数及专项测试Demo的更多相关文章
- iOS开发_统计xcode代码行数
如果要统计ios开发代码,包括头文件的,终端命令进入项目目录下,命令如下 find . -name "*.m" -or -name "*.h" -or -nam ...
- IOS开发 统计XCODE 代码行数
如果要统计ios开发代码,包括头文件的,终端命令进入项目目录下,命令如下 find . -name "*.m" -or -name "*.h" -or -nam ...
- 【未解决】对于使用Windows的IDEA进行编译的文件,但无法在Linux系统中统计代码行数的疑问
在我学习使用Windows的IDEA的过程中,将代码文件转移到Linux虚拟机当中,但无法在Linux系统中统计代码行数. 注意:拷贝进虚拟机的文件均能编译运行. 具体过程如下: root@yogil ...
- 麒麟系统开发笔记(二):国产麒麟系统搭建Qt开发环境安装Qt5.12
前言 开发国产应用,使用到银河麒麟V4,V10,本篇以V10记录,参照上一篇可安装V4.V7.V10三个版本,麒麟V4系自带了Qt,麒麟V10没有自带Qt,需要自己编译搭建环境. 银河麒麟V1 ...
- 树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)
若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/110940484长期持续带来更多项目与技术分享, ...
- Qt+MPlayer音乐播放器开发笔记(一):ubuntu上编译MPlayer以及Demo演示
前言 在ubuntu上实现MPlayer播放器播放音乐. Demo Mplayer MPlayer是一款开源多媒体播放器,以GNU通用公共许可证发布.此款软件 ...
- 麒麟系统开发笔记(三):从Qt源码编译安装之编译安装Qt5.12
前言 上一篇,是使用Qt提供的安装包安装的,有些场景需要使用到从源码编译的Qt,所以本篇如何在银河麒麟系统V4上编译Qt5.12源码. 银河麒麟V4版本 系统版本: Qt源码下载 ...
- acm系统开发笔记
时间: 2016/2/29 遇到的困难: 数据库配置的mysql和java(Date)不一致,出现下面错误 Date date = new Date(); SimpleDateFormat ...
- [开发笔记usbTOcan]需求获取与系统需求分析
简介 一直一以来都是站在实现某个模块功能的角度去做软件开发,没有尝试过站在系统的层面去做开发.最近正好不忙,觉得是时候以系统工程师的视角,去开发一个完整的系统.接下来的几篇文章,我会记录一个USB转C ...
- SSM商城系统开发笔记-配置01-web.xml
先占坑 慢慢填, 商城系统使用主体框架:Spring + Spring MVC + Mybatis 其他框架: 日志: slf4j + logback <!DOCTYPE web-app PUB ...
随机推荐
- [转帖]Linux文本处理三剑客sed详解(正则匹配、命令示例)
https://developer.aliyun.com/article/885609?spm=a2c6h.24874632.expert-profile.312.7c46cfe9h5DxWK 简介: ...
- css3文字阴影和盒子阴影
文字阴影 文字阴影的语法格式: text-shadow:水平向右的偏移值 向下的偏移值 迷糊度 阴影的颜色,水平向右的偏移值 向下的偏移值 迷糊度 阴影的颜色; 可以有多个阴影,但是在实际的项目中最多 ...
- 分享一个项目:`learning_go_plan9_assembly`, 学习 golang plan9 汇编
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 近期在学习 golang plan9 汇编,总算基本做到了 ...
- 离线下载和安装UWP(windows应用商店)软件
离线下载uwp安装包 打开商店,然后搜索您要的应用程序名称,进入应用界面 点击 分享按钮,在弹出窗口中选择[复制链接] 把链接粘贴到:https://store.rg-adguard.net/ 默认选 ...
- Json Schema高性能.net实现库 LateApexEarlySpeed.Json.Schema - 直接从code生成json schema validator
LateApexEarlySpeed.Json.Schema - Json schema validator generation from code 除了用户手动传入标准的json schema来生 ...
- Redis安装,数据类型及常用命令
安装 - 可以使用yum 安装,要先配置epel源 ``` yum install -y redis ``` - 可以编译安装 ``` wget http://download.redis.io/re ...
- 营销(marketing)、推广(Promotion)和 运营(Operation)的概念分别是什么?
首先要明确的原则: 1.你得承认"讨论任何事情之前不弄清楚概念定义就是耍流氓" 2.你得承认"由于每个人的经验学识和理解力的不同,我们常对概念定义产生分歧" 3 ...
- 【进阶篇】Java 实际开发中积累的几个小技巧(一)
目录 前言 一.枚举类的注解 二.RESTful 接口 三.类属性转换 四.Stream 流 五.判空和断言 5.1判空部分 5.2断言部分 文章小结 前言 笔者目前从事一线 Java 开发今年是第 ...
- Oracle 19c RAC自动应用RU补丁过程
笔者好久没有使用opatchauto打过补丁了,搜了下自己的历史随笔,上次opatchauto打补丁的记录还是Oracle 11g版本: Oracle 11g RAC 自动应用PSU补丁简明版 而11 ...
- 【MFC学习一】BROWSEINFO选择路径导出文件
mfc中使用 BROWSEINFO,使用 bi.lpfn = BrowseCallbackProc; 回调指定默认当前程序所在目录,导出csv文件,注意处理文件内容中的逗号.单引号.数字字符串开头有0 ...