google_breakpad库的基本使用

news2024/11/25 5:53:49

参考链接:

  1. windows下捕获dump之Google breakpad_client的理解
  2. Google Breakpad:基本介绍和操作方法
  3. Breakpad 入门
  4. linux下用QT捕获程序异常

简介

github 地址

三大组件

  1. client:读取当前线程的状态、加载的可执行文件、共享库等信息,写入到 minidump 中。可以放到应用中,应用崩溃时自动使用或显式调用;
  2. symbol dumper:读取编译器生成的调试信息,产生基于 breakpad 格式的 symbol file;
  3. processor:读取 minidump 寻找适合的 symbol file,生成可读的 C/C++ 调用栈。

运行流程图

为什么是 minidump?

Breakpad 在所有平台都使用 Windows 的 minidump 文件,而不是传统的 core 文件,原因是:

  1. .core 文件可能非常大,无法通过网络发送到收集器进行处理。Minidump 更小;
  2. .core 文件格式的文档记录很差。比如 Linux Standards Base 没有描述在 PT_NOTE 段中寄存器是如何存储的;
  3. Windows 机器生成 .core dump 文件比让其他机器生成 minidump 文件更难;
  4. 只有一个文件格式,简化了 breakpad 处理器。

minidump 的文件格式

包含:

  1. 该进程已加载的可执行文件和共享库列表,包括名称和版本;
  2. 进程中所有现场的列表,包括每个线程的寄存器状态、栈内容(纯字节流);
  3. 其他的系统信息,包括处理器、操作系统、崩溃原因等等。

minidump 的生成

默认情况下,breakpad 初始化时注册一个异常或信号处理函数,该函数能在异常发生时生成 minidump。注册方法有平台决定:

  1. Windows 中使用 SetUnhandledExceptionFilter()
  2. OS X 中创建一个线程来等待 Mach 例外端口;
  3. Linux 安装一个能处理像 SIGSEGV、SIGKILL 之类的信号处理函数;

一旦生成了 minudump,每个平台都有略微不同的方式来上传崩溃转储。在 Windows 和 Linux 上,提供了一个单独函数库,可以调用它来执行上传。在 OS X上,会生成一个单独的进程,提示用户授予权限(如果配置为这样做)并发送文件。

进程内、外异常处理

通常认为,在崩溃的进程内写入 minidump 是不安全的,因为关键的进程数据结构可能已经被破坏,或者异常处理器所运行的栈可能已经被覆写等。所以 3 个平台都支持所谓的“进程外”异常处理。

编译

根据提示文档进行常规的 ./configure; make; make install 即可。

整合到程序中

可以根据平台,直接参考 docs 目录下的 xxx_starter_guide.md 文档。

步骤:

  1. 注意:项目编译时需要连接好 libbreakpad_client.a 这个库文件;比如 Qt 项目中的 .pro 文件:LIBS += -lbreakpad_client;同时,避免部分文件找不到对应的头文件,在 .pro 中加入 INCLUDEPATH += /usr/local/include/breakpad
  2. main.cpp 中添加测试代码,如下:
#include <QCoreApplication>
#include "breakpad/client/linux/handler/exception_handler.h"

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[])
{
    QCoreApplication a(argc, argv);
    google_breakpad::MinidumpDescriptor descriptor("/tmp");
    google_breakpad::ExceptionHandler eh(descriptor, NULL, dumpCallback, NULL, true, -1);
    crash();

    return a.exec();
}
  1. 编译并运行程序后,可知,程序会在调用 crash() 函数后崩溃。

堆栈信息分析

程序运行后,会出现如下:

Dump path: /tmp/7ca76e22-4044-46fc-e06318b6-28aea319.dmp
按 <RETURN> 来关闭窗口...

程序崩溃时,生成了 .dmp 文件。

分析 .dmp 文件

x86 平台编译完 breakpad 库后,可以得到一系列工具和库。
以下步骤均在 x86 平台执行:

  1. 确保程序使用了 -g 编译,使用 dump_syms 对程序生成一份符号文件 .sym;如 dump\_syms /home/twdz/PersonalTest/build-breakpadDemo-Desktop\_Qt\_5\_12\_8\_GCC\_64bit-Debug/breakpadDemo > ./breakpad.sym
  2. 然后依次执行以下命令:
$head -n1 breakpadDemo.sym
MODULE Linux x86_64 7DDABFE2CC59CFD3ADF67085B2D231E60 breakpadDemo
$mkdir -p ./symbols/test/7DDABFE2CC59CFD3ADF67085B2D231E60
$mv breakpadDemo.sym ./symbols/test/7DDABFE2CC59CFD3ADF67085B2D231E60/
$minidump_stackwalk 7ca76e22-4044-46fc-e06318b6-28aea319.dmp ./symbols/ > stackTrace.log
  1. 将堆栈调用信息生成到 stackTrace.log 文件中,根据文件进行分析崩溃的位置,如:在这里插入图片描述
    3.1 从位置 1 可以看到崩溃的原因以及地址;发现地址为 0x0,依次往下寻找,最新的堆栈调用信息是在位置 2,而位置 3 说明了其具体的地址;
  2. 使用命令 addr2line 地址 -e 可执行程序名字 -f 可以定位具体的崩溃位置,如:addr2line 0x402451 -e ./breakpadDemo -f(这里采用 0x402451 这个地址是因为使用 0x0 和 0x2451 都无法获取到有效信息)。运行后,打印如下:
_Z5crashv
/home/twdz/PersonalTest/build-breakpadDemo-Desktop_Qt_5_12_8_GCC_64bit-Debug/../breakpadDemo/main.cpp:10

可知,main.cpp 文件第 10 行发生了崩溃。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/530008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Azure深层防御

深层防御的目的是保护信息&#xff0c;防止未经授权访问信息的人员窃取信息。 深层防御策略使用一系列机制来减缓攻击进度&#xff0c;这些攻击旨在获取对数据的未经授权的访问权限。 深层防御层 可以将深度防御可视化为一组层&#xff0c;并将要保护的数据放在中心&#xf…

一篇文章搞定ftp、dns服务器

一篇文章搞定ftp、dns服务器 1、ftp 安装ftp 挂载centos镜像cd /media/CentOS_6.8_Final/Packages安装命令&#xff1a;[rootlocalhost Packages]# rpm -ivh vsftpd-2.2.2-21.el6.x86_64.rpm Vsftpd配置目录为/etc/vsftpd&#xff0c;其中包含下面几个文件 /var/ftp/&#xf…

awk命令编辑

awk工作原理 逐行读取文本&#xff0c;默认以空格或tab键分隔符进行分隔&#xff0c;将分隔所得的各个字段保存到内建变量中&#xff0c;并按模式或者条件执行编辑命令。 sed命令常用于一整行的处理&#xff0c;而awk比较倾向于将一行分成多个“字段”然后再进行处理。awk信息…

做网工10年,没人在30岁前和我讲这些(一)

晚上好&#xff0c;我是老杨。 23年才刚过几天&#xff0c;我就感觉自己又上了点年纪&#xff0c;时常面对年纪比较小的粉丝&#xff0c;无意识的面露慈爱的笑容。 还是每次小冬提醒我&#xff0c;我才发现我的表情不对劲。 我对年轻人的包容度是很强的&#xff0c;尤其是一…

VMware、CentOS、XShell、Xftp的安装

第 1 章 VMware 1.1 VMware 安装 一台电脑本身是可以装多个操作系统的&#xff0c;但是做不到多个操作系统切换自如&#xff0c;所以我们 需要一款软件帮助我们达到这个目的&#xff0c;不然数仓项目搭建不起来。 推荐的软件为 VMware&#xff0c;VMware 可以使用户在一台计…

DNS正反向解析

正向解析 1.准备工作 关闭Selinux服务和firewalld服务 [rootserver ~]# setenforce 0 [rootserver ~]# systemctl stop firewalld 修改服务器与客户端的IP为静态IP地址 [rootserver ~]# nmcli connection modify ens160 ipv4.method manual ipv4.address …

剑指offer 19. 正则表达式匹配

文章目录 1. 题目描述2. 解题思想3. 设置dp初始值4.代码实现 1. 题目描述 2. 解题思想 定义dp数组 dp[i][j]&#xff1a;表示当字符串长度i&#xff0c;j是&#xff0c;s与p是否匹配 确定递推公式 核心是s[i]要与p[j]进行比较&#xff0c;比较的结果来确定 dp数组的值&#xf…

STM32-ADC多通道输入实验

之前已经介绍了几个ADC的笔记和实验了&#xff0c;链接如下&#xff1a; 关于ADC的笔记1_Mr_rustylake的博客-CSDN博客 STM32-ADC单通道采集实验_Mr_rustylake的博客-CSDN博客 STM32-单通道ADC采集&#xff08;DMA读取&#xff09;实验_Mr_rustylake的博客-CSDN博客 接下来…

NodeJs基础之NRM与NPM

nrm nrm can help you easy and fast switch between different npm registries, now include: npm, cnpm, taobao, nj(nodejitsu). 译文&#xff1a;nrm可以帮助您在不同的npm注册表之间轻松快速地切换&#xff0c;现在包括&#xff1a;npm、cnpm、taobao、nj&#xff08;no…

编译安装及yum安装

一、编译安装 源码包&#xff1a;是由程序员按照特定格式和语法编写的包 二进制包:源码包经过成功编译之后产生的包 1.tar -xf httpd-2.4.29.tar.bz #解压源码包 2.安装依赖环境 3.配置安装路径 4.编译make并安装 5.关闭防火墙&#xff0c;和安全机制 6.开启服务器 7.…

全电发票时代,记账凭证不用再打印了!

—政策通告— 为进一步推进电子发票应用和推广实施工作&#xff0c;助力国家数字经济发展&#xff0c;国家档案局会同财政部、商务部、国家税务总局总结三批增值税电子发票电子化报销、入账、归档试点经验&#xff0c;依据国家相关法律法规和标准规范&#xff0c;编制形成了《…

KMP匹配算法

目录 一、暴力匹配法动画演示代码实现 二、KMP算法的概念三、KMP算法的应用题目代码实现 一、暴力匹配法 动画演示 时间复杂度为&#xff1a; O ( m ∗ n ) O(m * n) O(m∗n) 代码实现 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;int…

Revit API:ErrorHandling

前言 本文介绍 Revit 的错误处理机制。 内容 程序员对错误处理的定义和理解 程序的错误处理机制可以分为两种类型&#xff1a;错误返回码和异常捕捉。 错误返回码是指在程序中遇到错误时&#xff0c;通过函数返回值来表明错误的类型和信息。错误返回码可以在程序中被预测和…

分段存储管理方式

目录 一、分段存储管理方式的引入的需求: 1.方便编程 2.信息共享 3.信息保护 4.动态增长 5.动态链接 二、分段系统的基本原理 1.分段 2.段表 3.地址变换机构 4.分页与分段的主要区别 三、信息共享 四、段页式存储管理方式 1.基本原理 2.地址变换过程 分段与分页…

Spring实现IOC和DI入门案例(XML版)

文章目录 1 IOC入门案例(XML版)1.1 思路分析1.2 代码实现步骤1:创建Maven项目步骤2:添加Spring的依赖jar包步骤3:添加案例中需要的类步骤4:添加spring配置文件步骤5:在配置文件中完成bean的配置步骤6:获取IOC容器步骤7:从容器中获取对象进行方法调用步骤8:运行程序 2 DI入门案例…

AltTab for Mac 像Windows一样的窗口快速切换工具

AltTab for Mac AltTab for Mac 是一款非常好用的窗口快速切换工具&#xff0c;AltTab将Windows的 “Alt-Tab” 窗口切换器的功能引入到了macOS。可以让您更快的在各个程序之间自由切换&#xff0c;大大提高您的工作效率。 AltTab for Mac下载 AltTab for Mac AltTab for Ma…

哈工大软件过程与工具作业2

云原生技术云原生技术 哈尔滨工业大学 计算机科学与技术学院/国家示范性软件学院 2022年秋季学期 《软件过程与工具》课程 作业报告 作业 2&#xff1a;需求分析UML建模 姓名 学号 联系方式 石卓凡 120L021011 944613709qq.com/18974330318 目 录 1 需求概述...........…

Vue3——简易版个人空间(上半部分)

创建项目 使用vue 的图形化界面创建一个新的vue3项目如下图所示 装两个新的插件——router和vuex插件 该过程的可能有点久&#xff0c;需要耐心等待。 再装一些需要的依赖 需要用到的依赖: boostrap和poperjs/core&#xff08;bootstrap是提供给不会做美工的程序员的一个新的…

物联网|uart串口相关寄存器|波特率设置及计算|发送处理代码|串口接收中断处理函数|物联网之蓝牙4.0 BLE基础-学习笔记(7)

文章目录 13 uart串口基础开发基本电路图&#xff1a;实验相关寄存器波特率设置及计算计算过程&#xff1a;设置中断发送处理代码串口接收中断处理函数main.c 13 uart串口基础开发 基本电路图&#xff1a; 实验相关寄存器 相关寄存器UxCSR、UxCSR、UxGCR、UxBUF、UxBAUD、CLK…

大厂设计师青睐的十大设计网站

设计绝对是薪酬差距最大的职业之一&#xff0c;有些人年薪100万&#xff0c;有些人月薪3000。 你有没有想过普通人和高薪设计师之间的差距在哪里&#xff1f; 在这篇文章中&#xff0c;我们将解密大厂设计师青睐的十大设计网站。让我们看看&#xff01; 1.即时设计 即时设计…