Hello 试用 breakpad (linux)

试用了一下 breakpad

breakpad 是一个收集程序crash 信息的系统,与gdb不同的是:gdb适合自己调试crash程序用; 而 breakpad 适合release 后的程序 (收集程序在用户手中运行crash的信息)

技术分享


安装breakpad

别在 github上乱找了(我找了两个都不能编译成功,貌似别人随便放在那里的,没有维护),用svn下载(TMD访问googlecode还要翻墙)

svn checkout http://google-breakpad.googlecode.com/svn/trunk/ google-breakpad-read-only


编译

使用下面的命令,就都编译了好了

mv google-breakpad-read-only google-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


运行得到下面的信息

./test 
Dump path: ./2d1b6c3c-169e-a935-6582667f-75b5fac0.dmp
Segmentation 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:16
16        *a = 1;
(gdb) 


方法2:

$ google-breakpad/src/tools/linux/dump_syms/dump_syms ./test | head -1
MODULE 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

http://jff.googlecode.com/git/notes/google-breakpad-howto.txt

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。