试用了一下 breakpad
breakpad 是一个收集程序crash 信息的系统,与gdb不同的是:gdb适合自己调试crash程序用; 而 breakpad 适合release 后的程序 (收集程序在用户手中运行crash的信息)
安装breakpad
别在 github上乱找了(我找了两个都不能编译成功,貌似别人随便放在那里的,,没有维护),用svn下载(TMD访问googlecode还要翻墙)
svn checkout google-breakpad-read-only
编译
使用下面的命令,就都编译了好了
mvgoogle-breakpad-read-onlygoogle-breakpad
cd google-breakpad; ./configure; make;
试用
编写程序如下
cat test.cpp #include <iostream>#include "client/linux/handler/exception_handler.h"static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor,void* context,bool succeeded){ printf("Dump path: %s\n", descriptor.path()); return succeeded;}void crash(){ volatile int* a = (int*)(NULL); *a = 1;}int main(int argc, char* argv[]){ google_breakpad::MinidumpDescriptor descriptor("."); google_breakpad::ExceptionHandler eh(descriptor,NULL,dumpCallback,NULL,true,-1); crash(); return 0;}用命令下面的命令编译
g++ -g -I google-breakpad/src -o test test.cpp google-breakpad/src/client/linux/libbreakpad_client.a -lpthread
运行得到下面的信息
./testDump path: ./2d1b6c3c-169e-a935-6582667f-75b5fac0.dmpSegmentation fault (core dumped)
参看stack 信息
方法1:
google-breakpad/src/tools/linux/md2core/minidump-2-core 2d1b6c3c-169e-a935-6582667f-75b5fac0.dmp > core
$ gdb ./test core
…Core was generated by `./test’.Program terminated with signal SIGSEGV, Segmentation fault.#0 0x0000000000401f26 in crash () at test.cpp:1616 *a = 1;(gdb)
方法2:
$ google-breakpad/src/tools/linux/dump_syms/dump_syms ./test | head -1MODULE Linux x86_64 F344E837CC5CA50047E4A236E36FA3BA0 test
$ mkdir -p ./symbols/test/F344E837CC5CA50047E4A236E36FA3BA0
$ google-breakpad/src/tools/linux/dump_syms/dump_syms ./test > ./symbols/test/F344E837CC5CA50047E4A236E36FA3BA0/test.sym$ google-breakpad/src/processor/minidump_stackwalk 2d1b6c3c-169e-a935-6582667f-75b5fac0.dmp symbols/…Thread 0 (crashed)0 test!crash [test.cpp : 16 + 0x4] rax = 0x0000000000000000 rdx = 0x0000000000617280 rcx = 0x0000000000000000 rbx = 0x0000000000000000…
本文没有讨论minidump文件的上传和下载
ref
https://code.google.com/p/google-breakpad/wiki/GettingStartedWithBreakpad
重新开始吧!下次我会吸取教训,不让自己犯同样的错误的;