本文来自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。

breakpad系列(2)——在Linux中使用breakpad的更多相关文章

  1. Linux学习系列--如何在Linux中进行文件的管理

    文件 在常见的Linux的文件系统中,经常使用能了解到的文件管理系统是分为多个文件夹进行管理的. 如何查看文件路径 pwd ,在文件目录中,会有一个点(.)代表的是当前目录,两个点(..)代表的是当前 ...

  2. 深入理解JAVA I/O系列六:Linux中的IO模型

    IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大致描述了数据从外部磁盘向运行中程序的内存中移动的过程. 用户空间.内核空间 现在操作系统都是采用虚拟存储器, ...

  3. 深入理解JAVA I/O系列六:Linux中的IO模型(转载的文章非常值得学习)

    From:http://www.cnblogs.com/dongguacai/p/5770287.html IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大 ...

  4. I/O模型系列之一:Linux I/O模型基本概念

    1. IO模型矩阵 基本 Linux I/O 模型的简单矩阵: 同步与异步:描述的是用户线程与内核的交互方式. 同步IO和异步IO的区别就在于:数据拷贝的时候进程是否阻塞! 同步是指用户线程发起IO请 ...

  5. breakpad系列(1)——起步

    原文来自breakpad目录中doc目录下的getting_started_with_breakpad文档,建议去看原文! 介绍 Breakpad是一个比Linux core机制更强大的.用于记录程序 ...

  6. TCP系列41—拥塞控制—4、Linux中的慢启动和拥塞避免(一)

    一.Linux中的慢启动和拥塞避免 Linux中采用了Google论文的建议把IW初始化成了10了.在linux中一般有三种场景会触发慢启动过程 1.连接初始建立发送数据的时候,此时cwnd初始化为1 ...

  7. TCP系列15—重传—5、Linux中RTO的计算

    之前我们介绍的都是协议中给出的RTO计算方法,下面我们看一下linux实现中RTO的计算方法.在linux中维护了srtt.mdev.mdev_max.rttvar.rtt_seq几个状态变量用来计算 ...

  8. Linux系列:Linux中如何安装.rpm、.tar、.tar.gz和tar.bz2文件

    转载自:https://blog.csdn.net/lanxuezaipiao/article/details/21896579 我以下面三个包为例:(三个包都在/etc/opt下) A. examp ...

  9. windows和linux中搭建python集成开发环境IDE——如何设置多个python环境

    本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...

随机推荐

  1. arp_ignore与arp_announce

    arp_ignore:定义接收到ARP请求时的响应级别0:只要本地设置的有相应的地址,就给予响应.(默认)1:仅回应目标IP地址是本地的入网地址的arp请求.2:仅回应目标IP地址是本地的入网地址,而 ...

  2. AI and Neuroscience: A virtuous circle

    转载:https://deepmind.com/blog/article/ai-and-neuroscience-virtuous-circle AI领域最近取得了显著进展.人工系统现在优于人类专家A ...

  3. 牛客网PAT练兵场-D进制的A+B

    题解:大多数做法是利用循环相除,取余.我是将将A+B传入f函数,利用递归实现D进制的输出 题目地址:https://www.nowcoder.com/questionTerminal/a2063993 ...

  4. Java 接口 抽象类 抽象方法

    abstract class elehousekeeping { //抽象家用电器类 abstract void opermode(); //抽象方法} class TV extends elehou ...

  5. ORB-SLAM: A Versatile and Accurate Monocular SLAM System 笔记(二)

    4. 自动地图初始化 地图初始化的目标是两个帧之间相对位姿来三角化一系列的点云(riangulate an initial set of map points),这个操作是独立与场景且不需要人为的干预 ...

  6. Mysql如何将某个字段的值,在原有的基础上+1?

    Eg: 电商项目中,需要统计某件商品的购买数量问题,这时产品提了一个bug,告诉你我需要你做一个购买数量统计?你会怎么做呢? 这里我只说我自己的思路,首先是浏览加购物车,创建订单并支付,mq消息消费后 ...

  7. markdown 语法总结(一)

    1.标题 代码 注:# 后面保持空格 # h1 ## h2 ### h3 #### h4 ##### h5 ###### h6 ####### h7 // 错误代码 ######## h8 // 错误 ...

  8. 【小白学PyTorch】8 实战之MNIST小试牛刀

    文章来自微信公众号[机器学习炼丹术].有什么问题都可以咨询作者WX:cyx645016617.想交个朋友占一个好友位也是可以的~好友位快满了不过. 参考目录: 目录 1 探索性数据分析 1.1 数据集 ...

  9. 烂大街的 Spring 循环依赖问题,你觉得自己会了吗

    文章已收录在 GitHub JavaKeeper ,N 线互联网开发.面试必备技能兵器谱,笔记自取. 微信搜「 JavaKeeper 」程序员成长充电站,互联网技术武道场.无套路领取 500+ 本电子 ...

  10. 使用HttpUrlConnection访问www.163.com遇到503问题,用设置代理加以解决

    一次我使用如下程序连接到网易,意图获取其网站的html文本: try { String urlPath = "http://www.163.com/"; URL url = new ...