【GiraKoo】Breakpad 崩溃分析系统

Breakpad 是 Google 开发的跨平台开源库,用于捕获应用程序崩溃并生成 Minidump 文件进行分析。 为了简化dmp的分析流程,开源了以下项目,可以从带有sym信息的so中解析出符号文件,结合dmp直接输出堆栈。

工具狐(ToolFox)/Breadpad Dump文件解析工具

核心功能

  1. 捕获崩溃:监控程序崩溃(段错误、异常等)
  2. 生成 Minidump :记录崩溃现场信息,生成轻量级 .dmp 文件
  3. 上传报告:可选择自动上传到服务器
  4. 离线分析:结合符号文件重建调用堆栈

工作原理

graph TB subgraph BuildTime ["编译时"] A[源代码] --> B[编译] B --> C[可执行文件] B --> D[调试信息] D --> E[dump_syms] E --> F[符号文件 .sym] end subgraph Runtime ["运行时"] G[程序启动] --> H[初始化 Breakpad] H --> I[注册异常处理] I --> J[正常运行] J --> K{崩溃?} K -->|是| L[捕获现场信息] L --> M[生成 Minidump] M --> N[上传文件] K -->|否| J end subgraph ServerSide ["服务器端"] N -.-> O[崩溃服务器] F -.-> P[符号存储] O --> Q[minidump_stackwalk] P --> Q Q --> R[生成崩溃报告] end style BuildTime fill:#e6f3ff style Runtime fill:#ffe6e6 style ServerSide fill:#e6ffe6

关键步骤

1. 编译时

  • 生成调试信息文件(.pdb.dSYM.debug
  • 使用 dump_syms 提取符号文件:
bash 复制代码
dump_syms your_app.pdb > your_app.sym

2. 运行时

  • 初始化 Breakpad 客户端
  • 注册异常处理器
  • 崩溃时捕获:寄存器、堆栈、模块信息
  • 生成 Minidump 文件

3. 服务器端分析

  • 接收 Minidump 文件
  • 使用符号文件解析地址:
bash 复制代码
minidump_stackwalk crash.dmp /path/to/symbols > report.txt

集成示例

cpp 复制代码
#include "client/windows/handler/exception_handler.h"

bool DumpCallback(const wchar_t* dump_path, const wchar_t* minidump_id,
                  void* context, EXCEPTION_POINTERS* exinfo,
                  MDRawAssertionInfo* assertion, bool succeeded) {
    if (succeeded) {
        wprintf(L"Dump generated: %s\\%s.dmp\n", dump_path, minidump_id);
    }
    return succeeded;
}

int main() {
    // 初始化 Breakpad
    google_breakpad::ExceptionHandler eh(
        L"./crashes",     // 保存目录
        nullptr,          // 过滤器
        DumpCallback,     // 回调函数
        nullptr,          // 用户数据
        google_breakpad::ExceptionHandler::HANDLER_ALL
    );
    
    // 应用程序代码
    return 0;
}

优势与局限

优势

  • 跨平台支持
  • 轻量级 Minidump 文件
  • 高可靠性
  • 开源免费

局限

  • 符号文件版本匹配要求严格
  • 不含堆内存信息
  • 需要服务器端处理

最佳实践

  1. 将符号文件生成集成到构建流程
  2. 为每个版本保存对应符号文件
  3. 建立自动化上传和分析流程
  4. 结合日志系统进行综合分析
  5. 设置崩溃率监控告警
相关推荐
yunhuibin1 小时前
无锁化编程——c++内存序使用
c++
zzzyyy5383 小时前
C++之vector容器
开发语言·c++
uotqwkn89469s5 小时前
如果Visual Studio不支持C++14,应该如何解决?
c++·ide·visual studio
Maple_land6 小时前
Linux复习:冯·诺依曼体系下的计算机本质:存储分级与IO效率的底层逻辑
linux·运维·服务器·c++·centos
ue星空6 小时前
UE核心架构概念
网络·c++·ue5
ShineWinsu8 小时前
对于数据结构:堆的超详细保姆级解析——下(堆排序以及TOP-K问题)
c语言·数据结构·c++·算法·面试·二叉树·
_OP_CHEN8 小时前
C++进阶:(五)map系列容器的全面解析
开发语言·c++·map·红黑树·stl容器·键值对·mapoj题
hetao17338378 小时前
ZYZ28-NOIP模拟赛-Round4 hetao1733837的record
c++·算法
大米粥哥哥8 小时前
c++ libcurl报错Send failed since rewinding of the data stream failed【已解决】
开发语言·c++·http·curl·rewind
woshimyc8 小时前
ESP32连接ThingsCloud上传设备数据(智慧小灯)
c++·物联网