麒麟系统开发笔记(十一):在国产麒麟系统上使用gdb定位崩溃异常方法流程进阶定位代码行数及专项测试Demo

简介: 上一篇,通过研究,可以定位到函数,本篇进一步优化,没有行数,程序较为复杂的时候,就无法定位,所以进一步定位。  本篇做了qBreakpad的研究,但是没有成功,过程也还是填出来,后来突然注意到gdb出现行数的方法,并通过了几轮测试以及实战,确实可以定位到行数,所以为了大家方便,把国企麒麟上的Qt崩溃方法分享出来。  本篇文章比较长,就不分篇了,同时还做了专项测试。

前言

  上一篇,通过研究,可以定位到函数,本篇进一步优化,没有行数,程序较为复杂的时候,就无法定位,所以进一步定位。

  本篇做了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入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
4月前
|
存储 人工智能 测试技术
HarmonyOS Next~HarmonyOS应用测试全流程解析:从一级类目上架到二级类目专项测试
本文深入解析HarmonyOS应用测试全流程,涵盖从一级类目通用测试到二级类目专项测试的技术方案。针对兼容性、性能、安全测试及分布式能力验证等关键环节,提供详细实践指导与代码示例。同时,结合典型案例分析常见问题及优化策略,帮助开发者满足华为严苛的质量标准,顺利上架应用。文章强调测试在开发中的核心地位,助力打造高品质HarmonyOS应用。
221 2
|
2月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
118 0
|
3月前
|
测试技术
软考软件评测师——可靠性测试测试方法
软件可靠性是指软件在规定条件和时间内完成预定功能的能力,受运行环境、软件规模、内部结构、开发方法及可靠性投入等因素影响。失效概率指软件运行中出现失效的可能性,可靠度为不发生失效的概率,平均无失效时间(MTTF)体现软件可靠程度。案例分析显示,嵌入式软件需满足高可靠性要求,如机载软件的可靠度需达99.99%以上,通过定量指标评估其是否达标。
|
3月前
|
消息中间件 缓存 监控
性能测试怎么做?方法、流程与核心要点解析
本文系统阐述了性能测试的核心方法论、实施流程、问题定位优化及报告编写规范。涵盖五大测试类型(负载验证、极限压力、基准比对、持续稳定性、弹性扩展)与七项关键指标,详解各阶段任务如需求分析、场景设计和环境搭建,并提供常见瓶颈识别与优化实战案例。最后规范测试报告内容框架与数据可视化建议,为企业级实践提出建立基线库、自动化回归和全链路压测体系等建议,助力高效开展性能测试工作。
|
5月前
|
人工智能 安全 测试技术
Burp Suite Professional 2025.3 发布,引入 Burp AI 通过人工智能增强安全测试工作流程
Burp Suite Professional 2025.3 发布,引入 Burp AI 通过人工智能增强安全测试工作流程
372 0
Burp Suite Professional 2025.3 发布,引入 Burp AI 通过人工智能增强安全测试工作流程
|
7月前
|
人工智能 自然语言处理 测试技术
AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架
AxBench 是由斯坦福大学推出,用于评估语言模型可解释性方法的基准测试框架,支持概念检测和模型转向任务,帮助研究者系统地比较不同控制技术的有效性。
160 5
AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架
|
3月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
701 23
|
8月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
5月前
|
SQL 安全 测试技术
2025接口测试全攻略:高并发、安全防护与六大工具实战指南
本文探讨高并发稳定性验证、安全防护实战及六大工具(Postman、RunnerGo、Apipost、JMeter、SoapUI、Fiddler)选型指南,助力构建未来接口测试体系。接口测试旨在验证数据传输、参数合法性、错误处理能力及性能安全性,其重要性体现在早期发现问题、保障系统稳定和支撑持续集成。常用方法包括功能、性能、安全性及兼容性测试,典型场景涵盖前后端分离开发、第三方服务集成与数据一致性检查。选择合适的工具需综合考虑需求与团队协作等因素。
614 24