前言

  上一篇,通过研究,可以定位到函数,本篇进一步优化,没有行数,程序较为复杂的时候,就无法定位,所以进一步定位。
  本篇做了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的更多相关文章

  1. iOS开发_统计xcode代码行数

    如果要统计ios开发代码,包括头文件的,终端命令进入项目目录下,命令如下 find . -name "*.m" -or -name "*.h" -or -nam ...

  2. IOS开发 统计XCODE 代码行数

    如果要统计ios开发代码,包括头文件的,终端命令进入项目目录下,命令如下 find . -name "*.m" -or -name "*.h" -or -nam ...

  3. 【未解决】对于使用Windows的IDEA进行编译的文件,但无法在Linux系统中统计代码行数的疑问

    在我学习使用Windows的IDEA的过程中,将代码文件转移到Linux虚拟机当中,但无法在Linux系统中统计代码行数. 注意:拷贝进虚拟机的文件均能编译运行. 具体过程如下: root@yogil ...

  4. 麒麟系统开发笔记(二):国产麒麟系统搭建Qt开发环境安装Qt5.12

    前言   开发国产应用,使用到银河麒麟V4,V10,本篇以V10记录,参照上一篇可安装V4.V7.V10三个版本,麒麟V4系自带了Qt,麒麟V10没有自带Qt,需要自己编译搭建环境.   银河麒麟V1 ...

  5. 树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/110940484长期持续带来更多项目与技术分享, ...

  6. Qt+MPlayer音乐播放器开发笔记(一):ubuntu上编译MPlayer以及Demo演示

    前言   在ubuntu上实现MPlayer播放器播放音乐.   Demo                Mplayer   MPlayer是一款开源多媒体播放器,以GNU通用公共许可证发布.此款软件 ...

  7. 麒麟系统开发笔记(三):从Qt源码编译安装之编译安装Qt5.12

    前言   上一篇,是使用Qt提供的安装包安装的,有些场景需要使用到从源码编译的Qt,所以本篇如何在银河麒麟系统V4上编译Qt5.12源码.   银河麒麟V4版本   系统版本:   Qt源码下载    ...

  8. acm系统开发笔记

    时间:     2016/2/29 遇到的困难:  数据库配置的mysql和java(Date)不一致,出现下面错误 Date date = new Date(); SimpleDateFormat ...

  9. [开发笔记usbTOcan]需求获取与系统需求分析

    简介 一直一以来都是站在实现某个模块功能的角度去做软件开发,没有尝试过站在系统的层面去做开发.最近正好不忙,觉得是时候以系统工程师的视角,去开发一个完整的系统.接下来的几篇文章,我会记录一个USB转C ...

  10. SSM商城系统开发笔记-配置01-web.xml

    先占坑 慢慢填, 商城系统使用主体框架:Spring + Spring MVC + Mybatis 其他框架: 日志: slf4j + logback <!DOCTYPE web-app PUB ...

随机推荐

  1. [转帖]sendfile“零拷贝”、mmap内存映射、DMA

    https://www.jianshu.com/p/7863667d5fa7 KAFKA推送消息用到了sendfile,落盘技术用到了mmap,DMA贯穿其中. 先说说零拷贝 零拷贝并不是不需要拷贝, ...

  2. [转帖]SkyWalking集成logback

    1.引入skywalking的jar包,导入的包和agent版本一致 <dependency> <groupId>org.apache.skywalking</group ...

  3. [转帖]AMD Zen4 霄龙 9004 转战嵌入式:192 框框无敌!秒杀对手 80%

    http://www.myzaker.com/article/64104f50b15ec02eb10eb659 其实,它就是把此前用于服务器.数据中心的霄龙 9004 系列的部分型号拿了过来,命名.规 ...

  4. [转帖]接口偶尔超时,竟又是JVM停顿的锅!

    https://www.cnblogs.com/codelogs/p/16391159.html 简介# 继上次我们JVM停顿十几秒的问题解决后,我们系统终于稳定了,再也不会无故重启了!这是之前的文章 ...

  5. 【0基础学爬虫】爬虫基础之自动化工具 Selenium 的使用

    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶.逆向相关文章,为实现从易到难全方位覆盖,特设[0基础学爬 ...

  6. RC4Drop加密:提升数据保护的新选择

    摘要:RC4Drop是一种基于RC4算法的加密技术,通过将明文数据分成多个部分并进行加密,实现了对数据的高效保护.本文将对RC4Drop加密技术的优缺点进行详细分析,并给出一个Java完整demo示例 ...

  7. StackFrame和StackTrace在Unity和C#中的区别

    本文通过实际例子来看看StackFrame和StackTrace有什么区别,分别在.NET和Unity中测试. .NET环境 测试代码 using System; using System.Diagn ...

  8. vim 从嫌弃到依赖(8)——使用命令模式编辑文本

    通过前面的文章,我们已经介绍了vim的普通模式.插入模式.可视模式.接下来让我们接着介绍vim中另一个强大的模式--命令行模式 命令模式简介 命令模式可以说在vim中的使用频率不亚于普通模式,像我们平 ...

  9. 6.4 Windows驱动开发:内核枚举DpcTimer定时器

    在操作系统内核中,DPC(Deferred Procedure Call)是一种延迟执行的过程调用机制,用于在中断服务例程(ISR)的上下文之外执行一些工作.DPC定时器是基于DPC机制的一种定时执行 ...

  10. LyScript 从文本中读写ShellCode

    LyScript 插件通过配合内存读写,可实现对特定位置的ShellCode代码的导出,或者将一段存储在文本中的ShellCode代码插入到程序堆中,此功能可用于快速将自己编写的ShellCode注入 ...