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

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, // 如果是服务端,则直接使用进程内dumpNULL);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.mzph.cn/news/130642.shtml

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

相关文章

【大数据】Apache NiFi 数据同步流程实践

Apache NiFi 数据同步流程实践 1.环境2.Apache NIFI 部署2.1 获取安装包2.2 部署 Apache NIFI 3.NIFI 在手&#xff0c;跟我走&#xff01;3.1 准备表结构和数据3.2 新建一个 Process Group3.3 新建一个 GenerateTableFetch 组件3.4 配置 GenerateTableFetch 组件3.5 配置 DBCP…

答题测评考试小程序的效果如何

在线答题系统是一种在线练习、考试、测评的智能答题系统&#xff0c;适用于企业培训、测评考试、知识竞赛、模拟考试等场景&#xff0c;管理员可任意组题、随机出题&#xff0c;答题者成功提交后&#xff0c;系统自动判分。 多种题目类型&#xff0c;两种答题模式 练习模式&a…

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題 新搭建的FLINK集群出现的问题汇总 1.新搭建的Flink集群和Hadoop集群无法正常启动Flink任务 查看这个提交任务的日志无法发现有用的错误信息。 进一步查看yarn日志&#xff1a; 发现只有JobManager的错误日志出现了如下的…

请求地址‘/operlog‘,发生未知异常

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是全栈工…

[nodejs] 爬虫加入并发限制并发实现痞客邦网页截图

今晚想给偶像的相册截个图,避免某一天网站挂了我想看看回忆都不行,用的是js的木偶师来爬虫台湾的部落格,效果图大概是这样,很不错 问题来了.我很贪心, 我想一次性把相册全爬了,也就是并发 ,这个人的相册有19个!!我一下子要开19个谷歌浏览器那个什么进程, 然后程序就崩了, 我就想…

软件设计模式原则(二)开闭原则

继续讲解第二个重要的设计模式原则——开闭原则~ 一.定义 开闭原则&#xff0c;在面向对象编程领域中&#xff0c;规定“软件中的对象&#xff08;类&#xff0c;模块&#xff0c;函数等等&#xff09;应该对于扩展是开放的&#xff0c;但是对于修改是封闭的”&#xff0c;这意…

半导体芯片制造行业MES系统解决方案

半导体产业作为现代电子科技的重要支柱&#xff0c;驱动着电子设备和通信技术的飞速发展。随着技术不断演进&#xff0c;半导体制造企业面临着越来越多的挑战&#xff0c;如高度复杂的工艺流程、全球化的竞争、质量控制的要求以及能源效率等问题。 为了应对这些挑战&#xff0…

Python测试之Pytest详解

概要 当涉及到python的测试框架时&#xff0c;pytest是一个功能强大且广泛应用的第三方库。它提供简洁而灵活的方式来编写和执行测试用例&#xff0c;并具有广泛的应用场景。下面是pytest的介绍和详细使用说明&#xff1a; pytest是一个用于python单元测试的框架&#xff0c;它…

Dubbo篇---第一篇

系列文章目录 文章目录 系列文章目录一、说说一次 Dubbo 服务请求流程?二、说说 Dubbo 工作原理三、Dubbo 支持哪些协议?一、说说一次 Dubbo 服务请求流程? 基本工作流程: 上图中角色说明: 二、说说 Dubbo 工作原理 工作原理分 10 层: 第一层:service 层,接口层,…

Flutter 05 组件状态、生命周期、数据传递(共享)、Key

一、Android界面渲染流程UI树与FlutterUI树的设计思路对比 二、Widget组件生命周期详解 1、Widget组件生命周期 和其他的视图框架比如android的Activity一样&#xff0c;flutter中的视图Widget也存在生命周期&#xff0c;生命周期的回调函数体现在了State上面。组件State的生命…

mysql索引深度学习

索引是什么&#xff1f; 索引是一种用于加快查询和索引的数据结构&#xff0c;其本质上就是一种排序好的数据结构&#xff0c;就类似书的目录。 索引的底层有多种实现的结构&#xff1a;b树&#xff0c;b树&#xff0c;Hash&#xff0c;红黑树。InnoDB和MyISAM的索引都是通过…

Python模块psutil:系统进程管理与Selenium效率提升的完美结合

前言 在前面编写一个Selenium的自动化程序时候&#xff0c;发现一个问题。 因笔记本配置较为差&#xff0c;所以每次初始化Selenium的WebDriver都会非常慢&#xff0c;整个等待过程是不友好的。 所以我就想到&#xff1a; 在程序中初始化一个全局的WebDriver对象&#xff0c…

算法——多数相和

三数 15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 所以代码实现应该是 vector<vector<int>> threeSum(vector<int>& nums) {int n nums.size();sort(nums.begin(), nums.end()); // 对数组进行排序&#xff0c;以便后续操作vector<vector…

快速了解推荐引擎检索技术

目录 一、推荐引擎和其检索技术 二、推荐引擎的整体架构和工作过程 &#xff08;一&#xff09;用户画像 &#xff08;二&#xff09;文章画像 &#xff08;三&#xff09;推荐算法召回 三、基于内容的召回 &#xff08;一&#xff09;召回算法 &#xff08;二&#xf…

C#高级--IO详解

零、文章目录 IO详解 1、IO是什么 &#xff08;1&#xff09;IO是什么 IO是输入/输出的缩写&#xff0c;即Input/Output。在计算机领域&#xff0c;IO通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出。输入和输出是信息处理系统&#xff08;例如计算器&…

分享者 - 携程旅游创作者搬砖项目图文教程

大家好&#xff01;携程这个出行旅游平台相信大家都不陌生吧。 每天都有大量的旅客在里面浏览攻略&#xff0c;寻找灵感和旅游建议。 那么&#xff0c;我们的项目就是把一些优质的小红书平台上的旅游攻略或作品&#xff0c;经过处理后搬运到携程平台上发布。 这个项目如何操作呢…

Portraiture4.1.2最新中文汉化版

提起PS后期修图人像美白磨皮&#xff0c;大家会想到各种磨皮工具&#xff0c;其中Portraiture这款磨皮效率超高&#xff0c;是99%摄影师的必备插件&#xff0c;一秒磨皮&#xff0c;无卡顿&#xff0c;效果好&#xff01;人像摄影师人均一款&#xff0c;磨皮质感非常好&#xf…

独创改进 | RT-DETR 引入双向级联特征融合结构 RepBi-PAN | 附手绘结构图原图

本专栏内容均为博主独家全网首发,未经授权,任何形式的复制、转载、洗稿或传播行为均属违法侵权行为,一经发现将采取法律手段维护合法权益。我们对所有未经授权传播行为保留追究责任的权利。请尊重原创,支持创作者的努力,共同维护网络知识产权。 文章目录 YOLOv6贡献RepBi-…

实习记录--(海量数据如何判重?)--每天都要保持学习状态和专注的状态啊!!!---你的未来值得你去奋斗

海量数据如何判重&#xff1f; 判断一个值是否存在&#xff1f;解决方法&#xff1a; 1.使用哈希表&#xff1a; 可以将数据进行哈希操作&#xff0c;将数据存储在相应的桶中。 查询时&#xff0c;根据哈希值定位到对应的桶&#xff0c;然后在桶内进行查找。这种方法的时间复…

一站式解决方案:体验亚马逊轻量服务器/VPS的顶级服务与灵活性

文章目录 一、什么是轻量级服务器/VPS 二、服务器创建步骤 三、服务器连接客户端(私钥登录) 四、使用服务器搭建博客网站 五、个人浅解及总结 一、什么是轻量级服务器/VPS 亚马逊推出的轻量级服务器/VPS&#xff1a;是一种基于云计算技术的虚拟服务器解决方案。它允许用户…