Linux googlebreakpad 编译
1. 下载源码
源码包括两部分,分为依赖库和 breakpad,网址一般会被屏蔽,需要墙一下。另,编译器需要支持 c++11. 我用的gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) 是可以的。
(1)依赖包
http://linux-syscall-support.googlecode.com/svn/trunk/lss/
src/third_party/lss
(2)breakpad 包
git clone https://chromium.googlesource.com/breakpad/breakpad
的master分支
2. 注意事项,直接下载 breakpad 代码编译,会编译失败。报错缺少 linux_syscall_support.h
需要用third_party/lss里的头文件。
(1) 进入 breakpad 的 src 目录的 third-party 文件夹,创建 lss 文件夹,拷贝下载的依赖包里的文件。
执行验证文件的正确性:gcc -Wall -Wextra -Wstrict-prototypes -c linux_syscall_support.h
3. 然后,./configure
make
4. 生成
./src/client/linux/libbreakpad_client.a
./src/client/mac/gcov/libgcov.a
./src/third_party/libdisasm/libdisasm.a
./src/libbreakpad.a
5. 编写、编译 demo
报错不支持 nullptr,因为需要支持 C++11才可以。
g++ -g -I ../breakpad/src/ -o breakpad_sample breakpad_sample.cpp ../breakpad/src/client/linux/libbreakpad_client.a -lpthread -std=c++11
6. 运行生成 dmp 文件
[root@018 test-breakpad]# ./breakpad_sample
Dump path: /tmp/c220e8a9-11ce-4fb3-aea619b4-c0f68967.dmp
Segmentation fault
7. 解析 dmp 文件
我创建了一个 core 文件夹,把 core文件、可执行breakpad_sample、c220e8a9-11ce-4fb3-aea619b4-c0f68967.dmp 、minidump-2-core、dump_syms拷贝过来。
有两种方法,一个是用minidump-2-core、 一个是用dump_syms。
我用的是minidump-2-core,执行指令:
./minidump-2-core e6f2524d-0bb5-46bc-b077df92-d49613b6.dmp > e6.core
gdb ./breakpad_sample e6.core
得到如下信息:
warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.
Failed to read a valid object file image from memory.
Core was generated by `./breakpad_sample'.
Program terminated with signal 11, Segmentation fault.
#0 0x0000000000401ea6 in crashHare () at breakpad_sample.cpp:19
19 *a = 1; // 放心的奔溃吧
Missing separate debuginfos, use: debuginfo-install glibc-2.17-157.el7_3.5.x86_64 libgcc-4.8.5-16.el7_4.2.x86_64 libstdc++-4.8.5-16.el7_4.2.x86_64
(gdb) list
14 }
15
16 static void crashHare()
17 {
18 int *a = (int *)(NULL);
19 *a = 1; // 放心的奔溃吧
20 }
21
22 int main(int argc, char *argv[])
23 {
(gdb) print a
$1 = (int *) 0x0
8. 执行 strip -s breakpad_sample 是不影响解析的。
9. breakpad_sample 源码如下:
#include #include "../breakpad/src/client/linux/handler/exception_handler.h"
//#include "../breakpad/src/third_party/lss/linux_syscall_support.h"
//#include "../breakpad/src/client/linux/handler/minidump_descriptor.h"
#include #include static bool dumpCallback(const google_breakpad::MinidumpDescriptor &descriptor,
void *context,
bool succeeded)
{
printf("Dump path: %s\n", descriptor.path());
return succeeded;
}
static void crashHare()
{
int *a = (int *)(NULL);
*a = 1; // 放心的奔溃吧
}
int main(int argc, char *argv[])
{
google_breakpad::MinidumpDescriptor descriptor("/tmp");
google_breakpad::ExceptionHandler eh(descriptor,
NULL,
dumpCallback,
NULL,
true,
-1);
crashHare();
return 0;
}