【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. 设置崩溃率监控告警
相关推荐
十秒耿直拆包选手2 小时前
Qt:主窗体(QMainwindow)初始化注意事项
c++·qt
霖004 小时前
C++学习笔记三
运维·开发语言·c++·笔记·学习·fpga开发
mit6.8244 小时前
[shad-PS4] Vulkan渲染器 | 着色器_重新编译器 | SPIR-V 格式
c++·游戏引擎·ps4
tan77º5 小时前
【Linux网络编程】Socket - TCP
linux·网络·c++·tcp/ip
Mike_Zhang6 小时前
C++使用WinHTTP访问http/https服务
c++
CHANG_THE_WORLD6 小时前
「macOS 系统字体收集器 (C++17 实现)」
开发语言·c++·macos
妄想出头的工业炼药师7 小时前
python和C++相互调用使用
开发语言·c++
景彡先生7 小时前
C++17 并行算法:std::execution::par
开发语言·c++
JiaJZhong7 小时前
力扣.最长回文子串(c++)
java·c++·leetcode