【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. 设置崩溃率监控告警
相关推荐
南境十里·墨染春水4 小时前
C++传记(面向对象)虚析构函数 纯虚函数 抽象类 final、override关键字
开发语言·c++·笔记·算法
2301_797172754 小时前
基于C++的游戏引擎开发
开发语言·c++·算法
比昨天多敲两行6 小时前
C++ 二叉搜索树
开发语言·c++·算法
Season4506 小时前
C++11之正则表达式使用指南--[正则表达式介绍]|[regex的常用函数等介绍]
c++·算法·正则表达式
问好眼6 小时前
《算法竞赛进阶指南》0x04 二分-1.最佳牛围栏
数据结构·c++·算法·二分·信息学奥赛
海海不瞌睡(捏捏王子)6 小时前
C++ 知识点概要
开发语言·c++
minji...8 小时前
Linux 进程信号(二)信号的保存,sigset_t,sigprocmask,sigpending
linux·运维·服务器·网络·数据结构·c++·算法
小菜鸡桃蛋狗10 小时前
C++——类和对象(下)
开发语言·c++
crescent_悦10 小时前
C++:Highest Price in Supply Chain
开发语言·c++
feng_you_ying_li10 小时前
底层实现map和set的第一步,AVL树的学习
c++