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 ...
随机推荐
- APEX安装
git clone https://github.com/NVIDIA/apex.gitcd apex export CUDA_HOME=/usr/local/cudapip3 install -v ...
- MySQL优化--IO调度算法优化
之前已经在微信公众号分享了数据库优化的方法,链接为https://mp.weixin.qq.com/s/6Atzk9UKPJRxxAs0nsKBXg . 其中操作系统部分介绍了IO调度算法的优化,本文 ...
- 双操作系统(ubuntu/windows7)安装教程
前言 前两天出于项目原因,本人心血来潮地给久经战场的电脑老大哥找个小媳妇,哈哈哈,装了两个系统.分别是用了多年的win7和接触不久的Ubuntu,在其中遇到了一些坑,在此记录下来,希望能给自己和大家带 ...
- efcore技巧贴-也许有你不知道的使用技巧
前言 .net 环境近些年也算是稳步发展.在开发的过程中,与数据库打交道是必不可少的.早期的开发者都是DbHelper一撸到底,到现在的各种各样的ORM框架大行其道.孰优孰劣谁也说不清楚,文无第一武无 ...
- vue的修饰符
v-on 缩写:@ 事件修饰符 .stop - 调用 event.stopPropagation(). //阻止冒泡 .prevent - 调用 event.preventDefault(). //阻 ...
- 企业站做seo用什么程序好
http://www.wocaoseo.com/thread-306-1-1.html 随着互联网的兴起,越来越多的人通过网络来了解自已想了解的资讯,网络营销已经慢慢的取代了传统的营销模式.很多企业现 ...
- go语言之字符串、指针、数组、切片、结构struct、面向对象
一: 字符串 概述: Go 语言将字符串作为 种原生的基本数据类型,字 符串的初始化可以使用字符串字面量. (1)字符串是常量,可以通过类 数组 索引访问其字节单元,但是不能修改某个字节的值 (2)宇 ...
- 揭秘!containerd 镜像文件丢失问题,竟是镜像生成惹得祸
导语 作者李志宇,腾讯云后台开发工程师,日常负责集群节点和运行时相关的工作,熟悉 containerd.docker.runc 等运行时组件.近期在为某位客户提供技术支持过程中,遇到了 contain ...
- sourse insight总是代码一写长了,就自动换行
sourse insight总是代码一写长了,就自动换行. Document Options里面Word Wrap选项不勾选.
- web-UI自动化必会技能—xpath轴,了解一下?
本来以为不会再更新UI自动化相关的东西了,不过最近群里的朋友在搞UI,提出了许多问题,我看了下,大多还是页面元素定位类的问题,那今天就再讲点. 一.先了解xpath 说到元素定位,大家应该都知道常见的 ...