在 ARM 嵌入式平台上,程序崩溃后往往只留下一句模糊的报错,日志里很难定位到崩溃现场。qBreakpad 是基于 google-breakpad 封装的 Qt 库,可以在程序崩溃时自动生成 dump 文件,方便事后用符号文件还原调用栈。本文记录一次在 ARM 环境下接入 qBreakpad 时踩到的编译坑及解决办法。
背景问题
在 ARM 环境下有一个不太确定的 bug,导致程序长时间运行后突然崩溃。由于问题难以复现、又拿不到崩溃现场的信息,于是决定编译 qBreakpad 集成到程序里,用它监控并生成 dump 文件。
拿到了 dmp 文件之后,还需要配套的 dump 分析工具来解析,结果在编译分析工具的时候又遇到了问题,正好借此机会把整个过程记录下来。
编译踩坑与解决
编译 qBreakpad 的过程中,执行 make 时报了如下错误:
linux_syscall_support.h:2408:75: error: listing the stack pointer register 'rsp' in a clobber list is deprecated
这个错误的直接原因是:linux_syscall_support.h 中的内联汇编把栈指针寄存器 rsp 写进了 clobber list,而较新版本的 GCC 已经将这种写法标记为废弃(deprecated),GCC 9 及以上版本会直接报错。这与代码本身的功能无关,纯粹是新编译器的兼容性问题。
作者的最终解决方案是给该处代码打了一个补丁:直接把 clobber list 中对 rsp 的声明去掉,重新编译即可通过。上游也有对应的 issue 记录了同样的问题,可以参考下面的链接。
配套资源
整理了两个配套资源,分别是适配好的 qBreakpad 库(ARM/x64)和编译好的 dump 分析工具,均来自 CSDN 下载:
- 配套的 qBreakpad 库(是 arm、x64 的):Linux-qt-QBreakpad包-C++文档类资源-CSDN下载
- dump 分析工具(编译好了现成的,不需要积分):qBreakpad dump 文件分析工具-C++文档类资源-CSDN下载
小结
在 ARM 平台上接入 qBreakpad,整体流程并不复杂,主要门槛在于用新版 GCC 编译时 linux_syscall_support.h 的兼容问题——遇到 listing the stack pointer register 'rsp' in a clobber list is deprecated 这类报错,直接去掉对应的 clobber 声明重新编译即可。搞定之后程序崩溃时就能稳定拿到 dump 文件,再配合符号文件和分析工具,定位长时间运行才复现的崩溃问题就有了抓手。