breakpad系列(2)——在Linux中使用breakpad
本文来自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的更多相关文章
- Linux学习系列--如何在Linux中进行文件的管理
文件 在常见的Linux的文件系统中,经常使用能了解到的文件管理系统是分为多个文件夹进行管理的. 如何查看文件路径 pwd ,在文件目录中,会有一个点(.)代表的是当前目录,两个点(..)代表的是当前 ...
- 深入理解JAVA I/O系列六:Linux中的IO模型
IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大致描述了数据从外部磁盘向运行中程序的内存中移动的过程. 用户空间.内核空间 现在操作系统都是采用虚拟存储器, ...
- 深入理解JAVA I/O系列六:Linux中的IO模型(转载的文章非常值得学习)
From:http://www.cnblogs.com/dongguacai/p/5770287.html IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大 ...
- I/O模型系列之一:Linux I/O模型基本概念
1. IO模型矩阵 基本 Linux I/O 模型的简单矩阵: 同步与异步:描述的是用户线程与内核的交互方式. 同步IO和异步IO的区别就在于:数据拷贝的时候进程是否阻塞! 同步是指用户线程发起IO请 ...
- breakpad系列(1)——起步
原文来自breakpad目录中doc目录下的getting_started_with_breakpad文档,建议去看原文! 介绍 Breakpad是一个比Linux core机制更强大的.用于记录程序 ...
- TCP系列41—拥塞控制—4、Linux中的慢启动和拥塞避免(一)
一.Linux中的慢启动和拥塞避免 Linux中采用了Google论文的建议把IW初始化成了10了.在linux中一般有三种场景会触发慢启动过程 1.连接初始建立发送数据的时候,此时cwnd初始化为1 ...
- TCP系列15—重传—5、Linux中RTO的计算
之前我们介绍的都是协议中给出的RTO计算方法,下面我们看一下linux实现中RTO的计算方法.在linux中维护了srtt.mdev.mdev_max.rttvar.rtt_seq几个状态变量用来计算 ...
- Linux系列:Linux中如何安装.rpm、.tar、.tar.gz和tar.bz2文件
转载自:https://blog.csdn.net/lanxuezaipiao/article/details/21896579 我以下面三个包为例:(三个包都在/etc/opt下) A. examp ...
- windows和linux中搭建python集成开发环境IDE——如何设置多个python环境
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
随机推荐
- 并发编程(叁):synchronize
synchronize synchronized是Java中的关键字,是一种常用的线程同步锁. 用法 注意:在理解synchronized时,要知道一个核心点,synchronized锁定的不是代码, ...
- HTTP基础 --响应
响应,由服务端返回给客户端,分为三部分:响应状态码(Response Status Code),响应头(Response Headers)和响应体(Response Body). 响应状态码 响应服务 ...
- SpringBoot(19)---SpringBoot整合Apollo
SpringBoot(19)---SpringBoot整合Apollo 有关Apollo之前已经写了两篇文章: 1.[Apollo](1)--- Apollo入门介绍篇 2.[Apollo](2)-- ...
- arduino智能循迹小车代码(三个循迹模块)
#include <Servo.h>int leftMotor1 = 3;int leftMotor2 = 5;int rightMotor1 = 6;int rightMotor2 = ...
- soso官方:搜索引擎的对检索结果常用的评测方法
http://www.wocaoseo.com/thread-188-1-1.html 很久很久以前,搜索引擎还不象今天的百花齐放,人们对它的要求较低,只要它能把互连网上相关的网站搜出来, ...
- .net技术栈转型心路历程分享
一.概要 本篇文章针对的是,长年写客户端(WPF/winfrom/delphi)的小伙伴想转后台写数据服务(asp.net mvc webapi , socket)或者想转其它技术,却又不知道改如何下 ...
- 无法创建新虚拟机: 无法打开配置文件“F:\BigData\vm12\centos01\centos01.vmx”: 拒绝访问。
退出,右键vmware选择以管理员身份运行即可.
- Laravel Reponse 响应客户端
Laravel Response 响应客户端 本篇文章逻辑较长,只说明和响应生命周期相关的必要代码. 本文主要内容顺序为: 1.执行上文管道中的then方法指定的闭包,路由的分发 2.在路由器中(Ro ...
- Pytest的装饰器——parametrize中ids里包含中文,用例标题显示异常如何解决?
在使用pytest做测试的过程中,经常会用到pytest.mark.parametrize来对批量生成测试用例,比如 @pytest.mark.parametrize( ['a', 'b', 'exp ...
- Unity 3D的版本控制问题
译林军 李慧爽|2014-02-13 11:21|9231次浏览|Unity(286)移动应用(19)技术开发(9)0 Unity中的源码控制并非和其他开发环境一样简单.我们可以从开发和美术两个角度讲 ...