Breakpad 是 Google 开发的跨平台开源库,用于捕获应用程序崩溃并生成 Minidump 文件进行分析。 为了简化dmp的分析流程,开源了以下项目,可以从带有sym信息的so中解析出符号文件,结合dmp直接输出堆栈。
工具狐(ToolFox)/Breadpad Dump文件解析工具
核心功能
- 捕获崩溃:监控程序崩溃(段错误、异常等)
- 生成 Minidump :记录崩溃现场信息,生成轻量级
.dmp
文件 - 上传报告:可选择自动上传到服务器
- 离线分析:结合符号文件重建调用堆栈
工作原理
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 文件
- 高可靠性
- 开源免费
局限:
- 符号文件版本匹配要求严格
- 不含堆内存信息
- 需要服务器端处理
最佳实践
- 将符号文件生成集成到构建流程
- 为每个版本保存对应符号文件
- 建立自动化上传和分析流程
- 结合日志系统进行综合分析
- 设置崩溃率监控告警