Breakpad在Windows,Linux双平台编译、集成以及dump文件的分析

news2024/12/26 15:26:36

Breakpad在Windows,Linux双平台编译、集成以及dump文件的分析

1、Windows平台

Windows平台上非常好的参考文档:

https://r12f.com/posts/google-breakpad-1-introduction-with-windows/

https://r12f.com/posts/google-breakpad-2-implementations-on-windows/

1.1、源码下载及编译

平台:Win10 + Intel

IDE:Visual Studio 2017

1.1.1、源码下载

github上的main分支一致编译不通过也没有gyp用于生成VS的sln。

当前我们使用github上breakpad的master分支即可

1.1.2、源码编译依赖

源码编译需要GYP生成VS打开的sln文件,GYP又依赖于python2.7.x版本

依赖关系:python2.7.x -> GYP -> Visual Studio;可顺序安装

详细请见:https://blog.csdn.net/zyhse/article/details/112577340博客

1.1.3、编译

breakpad只需要生成client中的项目,目录:breakpad-master\src\client\windows

该目录下可以看到breakpad_client.gyp文件(2023年后github main分支上已经没有该文件了)

使用安装好的GYP生成SLN(若gyp执行失败,大概率是python版本不对

gyp --no-circular-check "./breakpad_client.gyp" -Dwin_release_RuntimeLibrary=2 -Dwin_debug_RuntimeLibrary=3

使用vs2017打开调整为Release|x64编译

请添加图片描述

生成如上静态库

1.2、集成到现有代码中

breakpad集成到现有VS c++代码中非常的容易

1.2.1、包含头文件以及lib库

头文件:项目属性 -> C/C++ -> 附加包含目录 添加文件文件路径

lib库: 项目属性 -> 链接器 -> 常规 -> 附加库目录 添加库目录

​ 项目属性 -> 链接器 -> 输入 -> 附加依赖项 添加 common.lib crash_generation_client.lib crash_generation_server.lib exception_handler.lib 或使用代码方式添加

#pragma comment(lib, "common.lib")
#pragma comment(lib, "crash_generation_client.lib")
#pragma comment(lib, "crash_generation_server.lib")
#pragma comment(lib, "exception_handler.lib")

1.2.2、使用breakpad C/S模式增加下面代码段至项目中就好

// 头文件
#include "client/windows/handler/exception_handler.h"
#include "client/windows/crash_generation/crash_generation_server.h"
#include "client/windows/crash_generation/client_info.h"

// lib库
#pragma comment(lib, "common.lib")
#pragma comment(lib, "crash_generation_client.lib")
#pragma comment(lib, "crash_generation_server.lib")
#pragma comment(lib, "exception_handler.lib")

// server回调函数
void onClientConnected(void* context,
	const google_breakpad::ClientInfo* client_info) 
{
}

void onClientDumpRequest(void* context,
	const google_breakpad::ClientInfo* client_info,
	const std::wstring* file_path)
{
}

void onClientExited(void* context,
	const google_breakpad::ClientInfo* client_info) {
}

// client端回调函数,写完minidump后的回调函数
bool onMinidumpDumped(const wchar_t* dump_path, const wchar_t* id,
	void* context, EXCEPTION_POINTERS* exinfo,
	MDRawAssertionInfo* assertion,
	bool succeeded) {
	return succeeded;
}

bool InitBreakpad()
{
	if (_wmkdir(s_strCrashDir.c_str()) && (errno != EEXIST)) {
		return false;
	}

	google_breakpad::CrashGenerationServer *pCrashServer =
		new google_breakpad::CrashGenerationServer(s_pPipeName,
			NULL,
			onClientConnected,
			NULL,
			onClientDumpRequest,
			NULL,
			onClientExited,
			NULL,
			NULL,
			NULL,
			true,
			&s_strCrashDir);

	if (pCrashServer == NULL) {
		return false;
	}

	// 如果已经服务端已经启动了,此处启动会失败
	if (!pCrashServer->Start()) {
		delete pCrashServer;
		pCrashServer = NULL;
	}

	google_breakpad::ExceptionHandler *pCrashHandler =
		new google_breakpad::ExceptionHandler(s_strCrashDir,
			nullptr,
			onMinidumpDumped,
			NULL,
			google_breakpad::ExceptionHandler::HANDLER_ALL,
			MiniDumpNormal,
			(pCrashServer == NULL) ? s_pPipeName : NULL, // 如果是服务端,则直接使用进程内dump
			NULL);

	if (pCrashHandler == NULL) {
		return false;
	}
	return true;
}

int main(...)
{
    // ....
    bool ret = InitBreakpad();
    // ... 项目当前的代码 ...
}

1.3、dump文件分析

Windows上dump文件分析非常的简单,要么Visual Studio,要么Windbg。

下面我们使用windbg进行分析dump文件;

注意:项目生成exe文件必须要有pdb文件,该文件主要存储symbols的,如果没有请修改项目属性;
请添加图片描述
请添加图片描述

打开这两个属性就可以生成pdb文件了。

使用windbg打开dmp文件,配置好Symbol file path路径(就是该dump的exe对应的pdb文件路径)以及Source file path路径(该dump的exe的源码路径)
请添加图片描述

点击!analyze -v就行
请添加图片描述

非常容易的看到保存的代码行
请添加图片描述

2、Linux平台

linux平台与windows平台有些许不同。

首先是依赖项;

其次是分析dump文件的工具(breakpad自带的);

2.1、依赖项

需要去google上下载lss依赖包放在/breakpad-master/src/third_party/lss目录下,里面主要就是linux_syscall_support.h文件在代码中依赖了

2.2、分析工具

在linux上编译的breakpad会生成自带的分析工具minidump_stackwalk以及symbol生成工具dump_syms

  1. minidump_stackwalk:./breakpad-master/src/processor目录下
  2. dump_syms: ./breakpad-master/src/tools/linux/dump_syms目录下

2.3、具体使用

#include <unistd.h>
#include <thread>
#include <iostream>
#include "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; }

void task1(string msg)
{
    std::cout << "task1 says: " << msg << std::endl;
    crash();
}

int main(int argc, char* argv[]) {
  google_breakpad::MinidumpDescriptor descriptor("/tmp/hzh");
  google_breakpad::ExceptionHandler eh(descriptor, NULL, dumpCallback, NULL, true, -1);
  std::thread t1(task1, "Hello");
  t1.detach();
  sleep(2);
  return 0;
}
$ g++ -g a.cpp -I/home/hzh/soft/softy/breakpad/include/breakpad -L/home/hzh/soft/softy/breakpad/lib -lbreakpad -lbreakpad_client -pthread -o test

1,运行test,会崩溃并产生 179cac63-2e41-4de0-09e8b58c-56069f80.dmp 文件。

2,从可执行程序生成符号表:

$ /home/xxx/soft/softy/breakpad/bin/dump_syms test >> test.sym

3,建立一个目录结构,目录名必须为“可执行程序的名字”,然后再该目录里面建立一个目录,名字为 test.sym 的第一行的某个数据,具体如下:

$ head -n1 test.sym

得到: MODULE Linux x86_64 A35260606902350047A2A3559926FE410 test ,我们就要 A35260606902350047A2A3559926FE410 作为目录名。

$  mkdir -p ./symbols/test/A35260606902350047A2A3559926FE410

4,将 test.sym 移动到目录里:

$  mv test.sym symbols/test/A35260606902350047A2A3559926FE410/

5,开始分析:

$  /home/xxx/soft/softy/breakpad/bin/minidump_stackwalk 179cac63-2e41-4de0-09e8b58c-56069f80.dmp ./symbols

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

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

相关文章

数字银行:数据安全的挑战与对策

随着科技的进步和互联网的普及&#xff0c;传统的银行业务逐渐向数字化转型。数字银行&#xff0c;以其高效、便捷、个性化的服务特点&#xff0c;正在改变着人们的生活方式。然而&#xff0c;与此同时&#xff0c;数据安全问题也日益凸显。如何在享受数字银行便利的同时&#…

项目实战:添加新库存记录

1、在index.html添加超链接&#xff0c;添加新库存add.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><link rel"stylesheet" href"style/index.css"…

项目实战:修改水果库存系统特定库存记录

1、在edit.html修改库存页面添加点击事件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><link rel"stylesheet" href"style/index.css"><script s…

kubernetes集群编排——k8s存储

configmap 字面值创建 kubectl create configmap my-config --from-literalkey1config1 --from-literalkey2config2kubectl get cmkubectl describe cm my-config 通过文件创建 kubectl create configmap my-config-2 --from-file/etc/resolv.confkubectl describe cm my-confi…

18张图揭秘高性能Linux服务器内存池技术是如何实现的

大家生活中肯定都有这样的经验&#xff0c;那就是大众化的产品都比较便宜&#xff0c;但便宜的大众产品就是一个词&#xff0c;普通&#xff1b;而可以定制的产品一般都价位不凡&#xff0c;这种定制的产品注定不会在大众中普及&#xff0c;因此定制产品就是一个词&#xff0c;…

java基础练习(使用java实现跨库数据调度ETL)

简介 本文写一篇关于java库与库之间的数据传输&#xff0c;现实生产中可能是通过其他方式完成&#xff0c;在没有架构的基础上使用java实现跨库的数据传送&#xff0c;非常不便利。但是作为练习我觉得确实非常有用&#xff0c;涉及的java知识点相对较多。本文以一个实列讲解&am…

双十一越来越早,公域电商何去何从——深度解析

为什么双十一越来越早&#xff1f;传统的公域电商越来越饱和,某淘某东甚至和某79元网红打起了价格战 &#xff0c;市面上标品越来越多&#xff0c;商家越来越多&#xff0c;买东西的变少了&#xff0c;商家越卖越便宜。 公域电商&#xff1a; 就像一个大市场。里面摆满了各种商…

1015. 摘花生

题目&#xff1a; 1015. 摘花生 - AcWing题库 思路&#xff1a;dp 代码&#xff1a; #include<iostream> #include<cstdio> #include<cmath> using namespace std; const int N 110; typedef long long ll; int T, r, c; int num[N][N]; ll dp[N][N];//dp…

性能优化之懒加载 - 基于观察者模式和单例模式的实现

一、引入 在前端性能优化中&#xff0c;关于图片/视频等内容的懒加载一直都是优化利器。当用户看到对应的视图模块时&#xff0c;才去请求加载对应的图像。 原理也很简单&#xff0c;通过浏览器提供的 IntersectionObserver - Web API 接口参考 | MDN (mozilla.org)&#xff0c…

Express框架开发接口之书城商店原型图和数据库设计

1.原型图 这是利用Axure画的&#xff0c;简单画一下原型图&#xff0c;根据他们的业务逻辑我们完成书城商店API开发 首页 分类 商品详情 购物车 个人中心 2.数据库设计 首页 首页导航 导航栏产品 通过点击导航栏对应id和产品id关联获取产品内容 设置外建 sql语句 CR…

CRM系统数据库是如何影响客户体验的?

CRM客户关系管理由概念到软件实体&#xff0c;已经有几十年的时间&#xff0c;随着信息技术的进步&#xff0c;数字化让CRM软件乘上快车&#xff0c;迅速成为各类企业的数字化管理工具。CRM客户管理系统的一个重要功能便是改善并提升客户体验&#xff0c;且CRM数据库是与客户体…

朝夕光年游戏高光全套解决方案

作为全球用户与开发者的游戏研发与发行业务品牌——朝夕光年&#xff0c;一直致力于服务全球玩家&#xff0c;帮助玩家在令人惊叹的虚拟世界中一起玩耍与创造。 游戏研发的过程中遇到很多玩家痛点和提效、拉新的问题&#xff0c;如何帮助玩家更好地记忆、记录、分享和传播自己的…

【Redis】String字符串类型-内部编码使用场景

文章目录 内部编码使用场景缓存功能计数功能共享会话手机验证码 内部编码 字符串类型的内部编码有3种&#xff1a; int&#xff1a;8个字节&#xff08;64位&#xff09;的⻓整型&#xff0c;存储整数embstr&#xff1a;压缩字符串&#xff0c;适用于表示较短的字符串raw&…

工业5G路由器;小体积 千兆高速通信组网

计讯物联工业路由器TR232&#xff0c;5G高速网络&#xff0c;超低时延、高可靠性&#xff0c;小体积、易安装、强兼容&#xff0c;串口/网口多设备接入联网&#xff0c;为用户提供高速稳定的数据传输通道 。    小体积5G工业路由器TR323&#xff0c;外形1047824mm&#xff0…

el-popover触发元素位置改变后更新弹出框的偏移位置

el-popover的使用如下&#xff1a;包含一个触发元素和一个弹出框元素 但是如果触发元素位置发生变化时&#xff0c;如根据弹框选择内容&#xff0c;会显示或隐藏对应的元素&#xff0c;从而导致弹出框触发元素的位置的变化&#xff0c;此时触发元素位置变化了&#xff0c;但是…

C++ 初阶 类和对象(中)

前言&#xff1a;C初阶系列&#xff0c;每一期博主都会使用简单朴素的语言将对应的知识分享给大家&#xff0c;争取让所有人都可以听懂&#xff0c;C初阶系列会持续更新&#xff0c;上学期间将不定时更新&#xff0c;但总会更的 目录 一、构造函数 1.1为什么要有构造函数&…

树状数组 and 线段树

目录 &#x1f996;解释 -- 树状数组 &#xff08;一&#xff09;公式 &#xff08;二&#xff09;操作 (1) 求前缀和 (2) 某个位置上的数更新 &#x1f996;解释 -- 线段树 &#x1f33c;1264. 动态求连续区间和 AC 树状 AC 线段树 &#x1f33c;1265. 数星星 暴…

数字化时代,数据仓库是什么?有什么用?

在激烈的市场竞争和全新的数字经济共同作用下&#xff0c;数字化转型成为了大多数企业的共识&#xff0c;也是获取数字经济的最佳方式。在整个数据价值生产链路中&#xff0c;数据仓库的主要作用就是中心化分发&#xff0c;将原始数据与数据价值挖掘活动隔离。 所有的原始数据…

大数据毕业设计选题推荐-自媒体舆情分析平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Docker学习路线3:安装设置

Docker提供了一个名为Docker Desktop的桌面应用程序&#xff0c;简化了安装和设置过程。还有另一个选项可以使用Docker引擎进行安装。 Docker Desktop网站Docker引擎 Docker Desktop Docker Desktop是一款易于安装的应用程序&#xff0c;可使开发人员快速在其台式机上设置Do…