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 ...
随机推荐
- hbase运行流程图
hbase运行流程图
- Windows Server 2012 R2 时间同步
最近的项目两台服务器都是Windows Server 2012的系统,需要做时间同步,现在是一些从网上搜罗的步骤总结. 具体就是配置windows的注册表: 一.服务端配置 (NTP服务器,客户端将根 ...
- 焦大:做seo需要的三心二意
http://www.wocaoseo.com/thread-92-1-1.html 读过一些外国人写的教程之后,愈发觉得国外人写的教程甚是有趣,比起国内学习的课本来,真是不可同日而语. ...
- Qt 如何使窗体初始最大化
Qt 如何使窗体初始最大化 使用以下函数即可解决: void QWidget::setWindowState ( Qt::WindowStateswindowState ) 这样的函数,通过它可以设置 ...
- vue前端获取env中的常量
process.env.常量名 如:process.env.MIX_APP_URL
- 手写区分PC还是手机移动端
区分首先要了解window.navigator 输出navigator appCodeName: "Mozilla" appName: "Netscape" a ...
- 漏洞重温之sql注入(七)
漏洞重温之sql注入(七) sqli-labs通关之旅 Less-31 首先,进入31关,我们先添加上id参数. 然后,我们查看源码. 我们门可以看到,index页面源码其实很简单,网页也没有对我们的 ...
- Left Mouse Button (bfs)
Mine sweeper is a very popular small game in Windows operating system. The object of the game is to ...
- 实际项目中遇到EF实体类的操作问题及操作方法
之前一直做ASP,都是直接写数据库操作语句,但是现在使用linq或者EF了,具体数据库操作不会了,遇到几个问题,然后经过查找资料解决了,记录一下. 一.遇到序列化问题 遇到循环引用问题,我的项目是一个 ...
- 当this碰到return会发生什么
当this碰到return时 function fn(params) { this.user = 'fzy' return {} } var a = new fn console.log(a.user ...