qBreakpad 踩坑记:ARM 平台崩溃转储收集

在 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 下载:

小结

在 ARM 平台上接入 qBreakpad,整体流程并不复杂,主要门槛在于用新版 GCC 编译时 linux_syscall_support.h 的兼容问题——遇到 listing the stack pointer register 'rsp' in a clobber list is deprecated 这类报错,直接去掉对应的 clobber 声明重新编译即可。搞定之后程序崩溃时就能稳定拿到 dump 文件,再配合符号文件和分析工具,定位长时间运行才复现的崩溃问题就有了抓手。


   转载规则


《qBreakpad 踩坑记:ARM 平台崩溃转储收集》 由 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
GDB 系列导读:从入门到多线程调试的完整路径 GDB 系列导读:从入门到多线程调试的完整路径
这个系列把 GDB 相关的知识整理成了一条由浅入深的完整路径:从启动 gdb 的第一步开始,经过命令体系、数据查看,进入线程调试与 attach 场景,最后以死锁实战和多进程进阶收尾。全系列 13 篇,按发文时间顺序读即是推荐阅读顺序。 第
2021-02-06
下一篇 
Shell 实用技巧集锦 Shell 实用技巧集锦
Shell 是每个开发者的日常工具,掌握一些高频技巧能显著提升命令行下的工作效率。本文整理了别名定义、后台任务管理、重定向与管道、批量处理、进程管理、磁盘排查等实用技巧,每个技巧都配有可直接运行的示例,方便边看边练。 alias 命令别名对
2021-01-24
  目录