breakpad简单使用

breakpad简单使用

1. breakpad简介

breakpad是google开发的一个跨平台C/C++ dump捕获开源库,崩溃文件使用微软的minidump格式存储,也支持发送这个dump文件到你的服务器,breakpad可以在程序崩溃时触发dump写入操作,也可以在没有触发dump时主动写dump文件。breakpad支持windows、linux、macos、android、ios等。目前已有Google Chrome, Firefox, Google Picasa, Camino, Google Earth等项目使用。

2. 源码下载

git clone git@github.com:google/breakpad.git

3. 源码编译

cd breakpad
./configure && make -j`nproc`
sudo make install

3.1 编译遇到的问题

  1. third_party/lss/linux_syscall_support.h
fatal error: third_party/lss/linux_syscall_support.h: No such file or directory

解决方法

git clone git@github.com:linux-on-ibm-z/linux-syscall-support.git src/third_party/lss
  1. linux_syscall_support.h
./src/third_party/lss/linux_syscall_support.h:2379:75: error: listing the stack pointer register ‘rsp’ in a clobber list is deprecated [-Werror=deprecated]
 2379 |                              : "rsp", "memory", "r8", "r10", "r11", "rcx");

解决方法:

linux_syscall_support.h删除"rsp"即:
+++ b/linux_syscall_support.h
@@ -2376,7 +2376,7 @@ struct kernel_statfs {
                                "d"(LSS_SYSCALL_ARG(parent_tidptr)),
                                "r"(LSS_SYSCALL_ARG(newtls)),
                                "r"(LSS_SYSCALL_ARG(child_tidptr))
-                             : "rsp", "memory", "r8", "r10", "r11", "rcx");
+                             : "memory", "r8", "r10", "r11", "rcx");
       }
       LSS_RETURN(int, __res);
     }

4. In-Process测试程序:

test.cc源码

#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("/tmp");
  google_breakpad::ExceptionHandler eh(descriptor, NULL, dumpCallback, NULL, true, -1);
  crash();
  return 0;
}

4.1 测试程序编译

g++ -g -o test.cc test -I/usr/local/include/breakpad -lbreakpad_client -lpthread

4.2 生成sym文件

$ dump_syms ./test > test.sym
$ head -n1 test.sym
MODULE Linux x86_64 4665886B3016F300CC8655AF48A11AFE0 test
$ mkdir -p symbols/test/4665886B3016F300CC8655AF48A11AFE0 
$ mv test.sym symbols/test/4665886B3016F300CC8655AF48A11AFE0

4.3 产生minidump文件

$ ./test 
Dump path: /tmp/6164c367-f9b5-4bd4-20614abb-22b78a15.dmp
[1]    226680 segmentation fault (core dumped)  ./test

4.4 分析minidump文件

$ minidump_stackwalk /tmp/6164c367-f9b5-4bd4-20614abb-22b78a15.dmp ./symbols 
2022-06-01 18:20:55: minidump.cc:5093: INFO: Minidump opened minidump /tmp/6164c367-f9b5-4bd4-20614abb-22b78a15.dmp
2022-06-01 18:20:55: minidump.cc:5223: INFO: Minidump not byte-swapping minidump
2022-06-01 18:20:55: minidump.cc:5875: INFO: GetStream: type 15 not present
2022-06-01 18:20:55: minidump.cc:5875: INFO: GetStream: type 1197932545 not present
2022-06-01 18:20:55: minidump.cc:5875: INFO: GetStream: type 1197932546 not present
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for /home/guoyu/work/opensource/breakpad/test
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for /lib/x86_64-linux-gnu/libm.so.6
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for /lib/x86_64-linux-gnu/libc.so.6
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for /lib/x86_64-linux-gnu/libgcc_s.so.1
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for /usr/lib/x86_64-linux-gnu/libstdc++.so.6
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for /lib/x86_64-linux-gnu/libpthread.so.0
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for linux-gate.so
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for /home/guoyu/work/opensource/breakpad/test
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for /lib/x86_64-linux-gnu/libm.so.6
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for /lib/x86_64-linux-gnu/libc.so.6
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for /lib/x86_64-linux-gnu/libgcc_s.so.1
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for /usr/lib/x86_64-linux-gnu/libstdc++.so.6
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for /lib/x86_64-linux-gnu/libpthread.so.0
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
2022-06-01 18:20:55: minidump.cc:2267: INFO: MinidumpModule could not determine version for linux-gate.so
2022-06-01 18:20:55: minidump.cc:5875: INFO: GetStream: type 14 not present
2022-06-01 18:20:55: minidump_processor.cc:174: INFO: Found 2 memory regions.
2022-06-01 18:20:55: minidump_processor.cc:184: INFO: Minidump /tmp/6164c367-f9b5-4bd4-20614abb-22b78a15.dmp has CPU info, OS info, no Breakpad info, exception, module list, thread list, no dump thread, requesting thread, and no process create time
2022-06-01 18:20:55: minidump_processor.cc:223: INFO: Looking at thread /tmp/6164c367-f9b5-4bd4-20614abb-22b78a15.dmp:0/1 id 0x37578
2022-06-01 18:20:55: minidump.cc:483: INFO: MinidumpContext: looks like AMD64 context
2022-06-01 18:20:55: minidump.cc:483: INFO: MinidumpContext: looks like AMD64 context
2022-06-01 18:20:55: source_line_resolver_base.cc:241: INFO: Loading symbols for module /home/guoyu/work/opensource/breakpad/test from memory buffer, size: 244302
2022-06-01 18:20:55: simple_symbol_supplier.cc:196: INFO: No symbol file at ./symbols/libc.so.6/B4E6781872757C0C51969E69AB2D276F0/libc.so.6.sym
2022-06-01 18:20:55: stackwalker.cc:103: INFO: Couldn't load symbols for: /lib/x86_64-linux-gnu/libc.so.6|B4E6781872757C0C51969E69AB2D276F0
2022-06-01 18:20:55: minidump.cc:1391: INFO: MinidumpMemoryRegion request out of range: 0x8+8/0x7ffd3367b000+0x3000
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffa0594ab7f
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367c067
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x100011bff
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0xd2f00a1c903d9c68
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367c05f
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0xffffffffffffffff
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0xffffffffffffffff
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x2d0a6cd3ef3d9c68
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x2d0400ecd0539c68
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0xffffffffffffffff
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0xffffffffffffffff
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0xffffffffffffffff
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x0
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367c067
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367c077
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffa05bc618f
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0xffffffffffffffff
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0xffffffffffffffff
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367c05f
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0xffffffffffffffff
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0xffffffffffffffff
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367c057
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x1b
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x0
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d0ac
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0xffffffffffffffff
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d0b3
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d0d4
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d0e8
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d0f3
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d106
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d11b
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d123
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d134
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d148
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d15f
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d19e
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d1ba
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d1da
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d1f2
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d202
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d238
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d25d
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d26f
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d27d
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d291
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d2bf
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d2d6
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d2ed
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d2fc
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d328
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d335
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d3b4
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d440
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d46f
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d486
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d4a5
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d4bc
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d4c7
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d4d8
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d4f1
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d50b
2022-06-01 18:20:55: basic_code_modules.cc:111: INFO: No module at 0x7ffd3367d534
2022-06-01 18:20:55: minidump_processor.cc:348: INFO: Processed /tmp/6164c367-f9b5-4bd4-20614abb-22b78a15.dmp
Operating system: Linux
                  0.0.0 Linux 5.4.0-113-generic #127-Ubuntu SMP Wed May 18 14:30:56 UTC 2022 x86_64
CPU: amd64
     family 6 model 142 stepping 12
     1 CPU

GPU: UNKNOWN

Crash reason:  SIGSEGV /SEGV_MAPERR
Crash address: 0x0
Process uptime: not available

Thread 0 (crashed)
 0  test!crash() [test.cc : 9 + 0x4]
    rax = 0x0000000000000000   rdx = 0x0000000000000000
    rcx = 0x000055e0f7f5af90   rbx = 0x000055e0f6895620
    rsi = 0x0000000000000000   rdi = 0x000055e0f689d6c0
    rbp = 0x00007ffd3367bdb0   rsp = 0x00007ffd3367bdb0
     r8 = 0x0000000000000000    r9 = 0x000055e0f7f5af88
    r10 = 0x0000000000000008   r11 = 0x00007ffa0594abe0
    r12 = 0x000055e0f6882e10   r13 = 0x00007ffd3367c060
    r14 = 0x0000000000000000   r15 = 0x0000000000000000
    rip = 0x000055e0f6882f4c
    Found by: given as instruction pointer in context
 1  test!main [test.cc : 14 + 0x5]
    rbx = 0x000055e0f6895620   rbp = 0x00007ffd3367bf70
    rsp = 0x00007ffd3367bdc0   r12 = 0x000055e0f6882e10
    r13 = 0x00007ffd3367c060   r14 = 0x0000000000000000
    r15 = 0x0000000000000000   rip = 0x000055e0f6883021
    Found by: call frame info
 2  libc.so.6 + 0x24083
    rbx = 0x000055e0f6895620   rbp = 0x0000000000000000
    rsp = 0x00007ffd3367bf80   r12 = 0x000055e0f6882e10
    r13 = 0x00007ffd3367c060   r14 = 0x0000000000000000
    r15 = 0x0000000000000000   rip = 0x00007ffa05782083
    Found by: call frame info
 3  test!crash() [test.cc : 9 + 0x3]
    rsp = 0x00007ffd3367bfa0   rip = 0x000055e0f6882f55
    Found by: stack scanning
 4  test + 0x15620
    rbp = 0x000055e0f6882f55   rsp = 0x00007ffd3367bfa8
    rip = 0x000055e0f6895620
    Found by: call frame info
 5  test!_start + 0x2e
    rsp = 0x00007ffd3367c050   rip = 0x000055e0f6882e3e
    Found by: stack scanning
 6  0x7ffd3367c058
    rsp = 0x00007ffd3367c058   rip = 0x00007ffd3367c058
    Found by: call frame info

Loaded modules:
0x55e0f6880000 - 0x55e0f6895fff  test  ???  (main)
0x7ffa0560f000 - 0x7ffa056c2fff  libm.so.6  ???
0x7ffa0575e000 - 0x7ffa058f7fff  libc.so.6  ???  (WARNING: No symbols, libc.so.6, B4E6781872757C0C51969E69AB2D276F0)
0x7ffa05950000 - 0x7ffa05964fff  libgcc_s.so.1  ???
0x7ffa0596b000 - 0x7ffa05af1fff  libstdc++.so.6  ???
0x7ffa05b4d000 - 0x7ffa05b63fff  libpthread.so.0  ???
0x7ffa05b97000 - 0x7ffa05bbafff  ld-linux-x86-64.so.2  ???
0x7ffd3378a000 - 0x7ffd3378afff  linux-gate.so  ???
2022-06-01 18:20:55: minidump.cc:5065: INFO: Minidump closing minidump

5. reference

google-breakpad - 使用篇
Google Breakpad 源码解析

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt是一种用于开发跨平台图形用户界面的框架,Google Breakpad是一种开源的异常报告库。要下载qt google breakpad,首先需要在Qt官方网站上下载Qt框架的安装包。在官网上选择对应的操作系统(例如Windows,Linux,Mac等),然后选择所需的Qt版本(例如Qt5,Qt6等)。下载完成后,运行安装包并按照安装向导的指示进行安装。安装完成后,可以在系统中找到Qt的安装目录。 然后,需要在Google Breakpad的官方网站上下载Breakpad的源代码。在官网上找到源代码下载页面,并选择所需的版本。下载完成后,解压缩文件并进入源代码的目录。 接下来,需要将Breakpad源代码与Qt框架进行配置和构建。通过命令行进入Breakpad源代码目录,在该目录下创建一个新的构建目录,并进入该目录。使用CMake命令来配置Breakpad与Qt的构建。具体的配置命令根据不同的操作系统和需求而定。配置完成后,使用make或ninja等构建工具进行构建。 构建完成后,将生成的Breakpad库文件(如libbreakpad.so或breakpad.dll等)与Qt应用程序进行链接。可以在Qt应用程序的.pro文件中添加链接库的配置,或者在构建命令中进行链接。完成链接后,重新编译和运行Qt应用程序即可使用Google Breakpad进行异常报告的捕获和处理。 综上所述,下载Qt和Google Breakpad的过程包括下载Qt框架安装包、下载Breakpad源代码、配置和构建Breakpad与Qt的链接,并在Qt应用程序中使用Breakpad进行异常报告的处理。 ### 回答2: QT是一款强大的跨平台应用开发框架,Google Breakpad是一套用于应用程序崩溃报告的开源工具。想要在QT中下载Google Breakpad,可以按照以下步骤进行操作。 首先,在浏览器中搜索"Google Breakpad"并进入官方网站或GitHub页面。在该页面中,可以找到相关的下载链接和文档。 其次,根据自己的操作系统选择合适的版本下载。Google Breakpad支持多种操作系统,如Windows、Linux和Mac OS X等。选择与QT兼容的版本进行下载。 下载完成后,解压缩下载的文件。其中包含了Google Breakpad的源代码和示例程序等。 接下来,可以根据Google Breakpad提供的文档和示例程序进行学习和使用。文档中详细介绍了Google Breakpad使用方法和参数设置等。 最后,根据QT的需求,将Google Breakpad集成到QT应用程序中。通过在QT项目中引入Google Breakpad的代码和相关文件,可以实现应用程序的崩溃报告和分析功能。 总之,下载并集成Google Breakpad到QT中可以帮助开发者更好地追踪和分析应用程序的崩溃问题,提高应用程序的可靠性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值