本文来自breakpad源码目录中doc目录下的linux_starter_guide.md,建议直接去看原文。

如何将breakpad添加进你的Linux程序

  本文档是在Linux上使用Breakpad client库的概述。

构建Breakpad库

  Breakpad提供了一个Autotools构建系统,用于构建Linux client库和 processor库。在Breakpad源目录中运行`./configure && make`,将会在src/client/linux 目录下生成
一个名静态库libbreakpad_client.a,这个静态库中包含了应用程序崩溃时生成minidumps所需的所有代码。

将Breakpad集成到你的程序中

  首先,在你的应用程序中引用异常处理程序头文件,然后在编译中记得链接breakpad提供的静态库libbreakpad_client.a,在编译中头文件搜索包含breakpad的src目录。具体可以参考下面的编译命令。

#include "client/linux/handler/exception_handler.h"

  现在可以在你的程序中实例化一个ExceptionHandler对象。 异常处理在ExceptionHandler对象的生命周期内处于活动状态,因此应用程序的启动过程中尽早实例化它,并且使其处于保活状态(尽可能长时间)。为了做一些有用的事情,ExceptionHandler构造函数需要一个有写权限的路径来写入minidump文件,以及一个回调函数来接收有关已写 minidump的信息:

  

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;
}

  编译并运行此示例,将会在/ tmp中生成一个minidump文件,并且在退出之前应打印minidump文件名。 您可以通过exception_handler.h头文件了解有关ExceptionHandler构造函数的其他参数的更多信息。

  编译命令如下:其中如要注意的点:1)我的测试Demo名称为test2.cpp。2)我的测试Demo位于Breakpad的src目录下。3)我的编译命令是在进入breakpad的src目录下执行的。4)参数-I 指定头文件搜索路径。因为我当前位于breakpad的src目录下,所以头文件搜索的也就是breakpad的src目录。5)如果你的g++版本比较新,直接支持C++11,则不需要明确给出-std=c++11。

$ g++ -g -I ./ -o breakpad_test test2.cpp ./client/linux/libbreakpad_client.a -lpthread -std=c++11

注意:你应该在回调函数中做尽可能少的工作。当前应用程序处于不安全状态。从其他函数库分配内存或调用函数可能并不安全。
      如果你必须要在回调函数中实现一些功能,最安全的操作是`fork`和`exec`一个新的进程来执行你需要做的任何功能。Breakpad源码中包含[libc函数的一些简单重新实现][2],避免直接调用libc库,同样 [用于进行Linux系统调用的头文件][3](in src/third_party/lss),避免直接调用一些其他的动态库。

发送minidump文件

  在实际的应用程序中,你可能希望以某种方式处理minidump文件,可能是将其发送到服务器进行分析。Breakpad源码树中包含可能有用的东西,[关于HTTP上传的源代码] [4],以及[小型转储上传工具] [5]。

  [4]: breakpad/src/common/linux/http_upload.h
  [5]: breakpad/src/tools/linux/symupload/minidump_upload.cc

为你的应用程序生成符号文件

  为了产生有用的堆栈跟踪信息,Breakpad要求将二进制文件中的调试符号转换为[文本格式的符号文件] [6]。首先,确保已使用-g编译你的二进制文件以包含调试符号。 其次,在Breakpad源目录中执行configure && make编译dump_syms工具,最后,在你的二进制文件上运行`dump_syms`,产生文本格式的符号。例如,你的二进制文件名为“ test”: 

$ google-breakpad/src/tools/linux/dump_syms/dump_syms ./test > test.sym

  [6]: breakpad/docs/symbol_files.md

  为了将这些符号与minidump_stackwalk工具一起使用,你需要将它们放在特定的目录结构中。 例如,符号文件的第一行包含生成此目录结构所需的信息(你的输出将有所不同):

$ head -n1 test.sym MODULE Linux x86_64 6EDC6ACDB282125843FD59DA9C81BD830 test
$ mkdir -p ./symbols/test/6EDC6ACDB282125843FD59DA9C81BD830
$ mv test.sym ./symbols/test/6EDC6ACDB282125843FD59DA9C81BD830

  你可能还会在Mozilla存储库中找到[symbolstore.py] [7]脚本,该脚本封装了这些步骤。

  [7]: https://dxr.mozilla.org/mozilla-central/source/toolkit/crashreporter/tools/symbolstore.py

处理minidump以产生堆栈跟踪信息

  Breakpad包含一个名为`minidump_stackwalk`的工具,该工具可以提取一个minidump文件及其相应的文本格式符号,并生成符号化的堆栈跟踪。如果你是按照上述说明编译的Breakpad源代码,则该文件应位于google-breakpad / src / processor目录中。 只需将minidump和符号路径作为命令行参数传递给它:

$ google-breakpad/src/processor/minidump_stackwalk minidump.dmp ./symbols

  它在stderr上生成详细输出,而在stdout上生成stacktrace,因此你可能需要重定向stderr。

最新文章

  1. 导出数据到Excel --使用ExcelReport有感
  2. 高效 Java Web 开发框架 JessMA v3.2.3 正式发布
  3. html5 调用摄像头
  4. Hadoop学习笔记: 全排序
  5. Sprint1(11.20)
  6. HDU 2594 Simpsons’ Hidden Talents(辛普森一家的潜在天赋)
  7. 设计模式 命令-Command
  8. 解决Dagger2和butterknife冲突
  9. Ubuntu+Win7+Samba实现文件共享
  10. hdu 5073 Galaxy(2014acm鞍山亚洲分部 D)
  11. 关于Response.redirect和Response.End出现线程中止异常的处理
  12. Percona监控MySQL模板详解
  13. 项目在tomcat里运行一段时间总是自动崩掉的问题排查与解决
  14. ​Installing the Ranger Kafka Plug-in
  15. 在ASP.NET Core中使用brotli压缩
  16. 记录腾讯云中矿机病毒处理过程(重装系统了fu*k)
  17. EF CodeFirst系列(2)---CodeFirst的数据库初始化
  18. hdu6024 Building Shops(区间dp)
  19. spring aop无法拦截类内部的方法调用
  20. 无法跨越程序集边界使用程序集“DataCheck, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中的类型“List<ILayer>”,因为该类型有一个为嵌入互操作类型的泛型类型参数

热门文章

  1. Linux环境下安装Redis数据库
  2. WS以及NW小世界网络的生成(MATLAB)
  3. 在Unity中检测死循环和卡死
  4. 从零开始的SpringBoot项目 ( 六 ) 整合 MybatisPlus 实现代码自动生成
  5. Java后台服务慢优化杂谈
  6. Javascript常见数据类型API
  7. SpringCloud Alibaba Nacos 服务注册
  8. 【Android】在开发项目的时候,利用AndroidStudio开发工具,突然一直报错。
  9. Visual Studio Installer闪退问题解决方法
  10. Linux/Unix Terminal中文件/目录的颜色各代表什么意思?