linux breakpad 编译,linux 平台编译googlebreakpad并测试 demo

阎唯
2023-12-01

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;

}

 类似资料: