C++(Qt)软件调试---crashpad捕获崩溃(19)

devtools/2024/9/19 19:09:57/ 标签: c++, qt, crashpad, 软件调试

crashpad19_0">C++(Qt)软件调试crashpad捕获崩溃(19)

文章目录

  • C++(Qt)软件调试---crashpad捕获崩溃(19)
    • 1、概述
    • 2、资源地址
    • 3、配置环境
    • 4、解决报错
    • 5、测试代码
    • 6、测试结果
    • 7、Qt中使用crashpad

更多精彩内容
👉个人内容分类汇总 👈
👉C++软件调试、异常定位 👈

1、概述

Crashpad 是一个由 Google 开发的开源库,是 Google Breakpad 库的继任者。

用于在应用程序崩溃时捕获和处理崩溃信息。它是 Chromium 项目的一部分,因此广泛应用于各种浏览器和应用程序中,如 Google Chrome 和 Electron。以下是 Crashpad 的几个关键功能和组成部分的详细说明:

  1. 崩溃报告: Crashpad 的主要功能是捕获应用程序崩溃时的状态,包括崩溃的上下文信息、调用堆栈、寄存器状态等。这些信息被封装成崩溃报告发送到预设的服务器上。
  2. 后端服务: Crashpad 配置了一个服务器端组件,通常称为 crash server,它负责接收、存储和分析崩溃报告。这个服务可以帮助开发者收集和分析崩溃数据,从而识别和解决软件中的问题。
  3. 客户端库: Crashpad 包括一个客户端库,该库被集成到应用程序中,用于监控程序运行状态。一旦检测到崩溃,它会触发崩溃报告的生成和上传。
  4. 最小化性能影响: Crashpad 的设计旨在尽量减少对应用程序性能的影响。它的捕获和报告机制非常高效,确保即使在应用程序发生崩溃时,也能快速有效地处理崩溃数据。
  5. 跨平台支持: Crashpad 支持多个平台,包括 Windows、macOS 和 Linux,这使得它可以在不同操作系统的应用程序中使用。
  6. 易于集成和使用: Crashpad 设计了易于使用的 API 和工具,开发者可以通过简单的配置和少量代码将 Crashpad 集成到自己的应用程序中。

演示环境:

  • Windows11
  • Visual Studio 2017
  • Qt5.14.2
  • MSVC2017-64

2、资源地址

  1. 编译好的crashpad地址:Nginx Directory (backtrace.io)
  2. Crashpad 集成指南
  3. 源码地址
  4. 支持Cmake的源码
  5. Crashpad:Crashpad 接口文档 (chromium.org)
  6. 手册
  7. 配置参数说明

注意:源码编译依赖很多(国内可能不好访问),所以可以直接下载编译好的。

3、配置环境

注意:使用Debug编译就链接crashpad-debug-x86-64-latest,使用Release编译就链接crashpad-release-x86-64-latest;区分32位和64位。

  1. 头文件添加

    在这里插入图片描述

  2. 添加库目录,默认使用/md的动态链接就可以

    在这里插入图片描述

  3. 添加库

在这里插入图片描述

  1. 设置编译参数

    • 动态链接

      • Release:/MD
      • Debug:/MDd
    • 静态链接

      • Release:/MT
      • Debug:/MTd

    在这里插入图片描述

4、解决报错

  1. 在配置完环境就可以直接编译了,但是可能会出现报错;

    E1097 未知特性 "no_init_all"		
    C2589 “(”:“::”右边的非法标记
    

    在这里插入图片描述

  2. 在使用到crashpad头文件之前添加#define NOMINMAX就可以了;

    在这里插入图片描述

5、测试代码

#include <stddef.h>
#include <string.h>
#include <iostream>
#include <thread>
#include <chrono>#define NOMINMAX
#include <client/crash_report_database.h>
#include <client/settings.h>
#include <client/crashpad_client.h>
#include <client/crashpad_info.h>std::unique_ptr<crashpad::CrashReportDatabase> database;static bool startCrashHandler(std::string const& url, std::wstring const& handler_path, std::wstring const& db_path)
{using namespace crashpad;std::map<std::string, std::string> annotations;std::vector<std::string> arguments;annotations["format"] = "minidump";       // 设置生成minidumparguments.push_back("--no-rate-limit");   // 禁用了崩溃速率限制base::FilePath db(db_path);base::FilePath handler(handler_path);database = crashpad::CrashReportDatabase::Initialize(db);   // 打开一个崩溃报告数据库if (database == nullptr || database->GetSettings() == NULL){return false;}database->GetSettings()->SetUploadsEnabled(true);    // 启用自动上传。// 启动一个crash处理程序进程return CrashpadClient().StartHandler(handler, db, db, url, annotations, arguments, false, false, {});
}int main(int argc, char** argv)
{std::string url("http://127.0.0.1:8000");               // 存储服务器的url,这里设置位本地地址std::wstring handler_path(L"./crashpad_handler.exe");   // 指向crashpad_handler.exe的路径std::wstring db_path(L"./crash");                       // 存储dump的路径startCrashHandler(url, handler_path, db_path);int* p = nullptr;*p = 123;return 0;
}

6、测试结果

  • crashpad_handler.exe放到可以找到的路径下,双击运行测试程序;
  • 在crash路径下生成dmp文件。

在这里插入图片描述

crashpad_165">7、Qt中使用crashpad

pro文件配置


INCLUDEPATH += E:/test/untitled4/crashpad/include/
INCLUDEPATH += E:/test/untitled4/crashpad/include/mini_chromium/
INCLUDEPATH += E:/test/untitled4/crashpad/include/util/LIBS += -L$$PWD/crashpad/lib_md/ -lbase -lclient -lutil -lcommon -lAdvapi32
  • 注意要添加 Advapi32.lib,动态库为 Advapi32.dll
  • Advapi32说明

http://www.ppmy.cn/devtools/21129.html

相关文章

运算符重载(2)

1.赋值运算符重载 #include<iostream> using namespace std;class Person { friend void test01(); public:Person(int age){m_Age new int(age);}/*堆区的数据由程序员手动开辟并手动释放*/~Person(){if (m_Age ! NULL){delete m_Age;}}Person& operator(Person &a…

【网络安全】跨站脚本攻击(XSS)

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、XSS简介 二、XSS漏洞危害 三、XSS漏洞类型 1.反射型XSS 2.存储型XSS 3.DOM型XSS 四、XSS漏洞防御 一、XSS简介 XSS&#xff08;Cross-Site Scripting&#xff09; XSS 被…

观察者模式:实现对象间的松耦合

在软件设计中&#xff0c;对象之间的通信是一个常见的问题。观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在其状态发生变化时通知其他对象。这种模式创建了一种依赖关系&#xff0c;使得一个对象改变状态时&#xff0c;所有…

ubuntu 24.04 beta server NAT模式上网设置

在Ubuntu 24.04 Beta上设置网络通常涉及使用命令行工具。以下是设置静态IP地址和动态IP地址的步骤&#xff1a; 动态IP设置&#xff1a; 查找你的网络接口名称&#xff1a; ip a ens37是我NAT模型的一张网卡&#xff0c;此时是没有ip的。 下面介绍如何NAT模式下添加DHCP动态…

2024 年最好的免费数据恢复软件,您可以尝试的几个数据恢复软件

由于系统崩溃而丢失数据可能会给用户带来麻烦。我们将重要的宝贵数据和个人数据保存在我们的 PC、笔记本电脑和其他数字设备上。您可能会因分区丢失、意外删除文件和文件夹、格式化硬盘驱动器而丢失数据。数据丢失是不幸的&#xff0c;如果您不小心从系统中删除了文件或数据&am…

在使用 sqlite 时遇到的奇怪问题的正解

在使用 sqlite 时遇到的奇怪问题&#xff0c; 用 DB Browser for SQLite &#xff08;一款 sqlite 可视化工具&#xff09;操作 sqlite 数据库 &#xff0c;一个名叫 testDB 的数据库&#xff08;位置在C:\sqlite\testDB.db&#xff09;&#xff0c;在里面建了一个表&#xff0…

Python搭建http下载服务器

import http.server import socketserverPORT 8002Handler http.server.SimpleHTTPRequestHandlerwith socketserver.TCPServer(("", PORT), Handler) as httpd:print("serving at port", PORT)httpd.serve_forever()使用&#xff1a; 保存为httpserver.…

Node.JS安装及配置教程(Windows)【安装】

文章目录 一、 Node.JS 下载1. 官网下载&#xff08;1&#xff09;国内地址&#xff08;2&#xff09;国外地址 2. 其它渠道 二、 Node.JS 安装三、 Node.JS验证四、 Node.JS 配置&#xff08;可选&#xff09;1. 配置全局模块安装路径方法一方法二2. 配置国内镜像 五、 yarn 安…

Day17.一刷数据结构算法(C语言版) 654最大二叉树;617合并二叉树;700二叉搜索树中的搜索;98验证二叉搜索树

又是破防的一天...... 一.654最大二叉树 又是构造二叉树&#xff0c;昨天大家刚刚做完 中序后序确定二叉树&#xff0c;今天做这个 应该会容易一些&#xff0c; 先看视频&#xff0c;好好体会一下 为什么构造二叉树都是 前序遍历 题目链接&#xff1a;最大二叉树 文章讲解&…

漏洞端到端管理小总结

漏洞端到端管理最佳实践涵盖了从漏洞的发现、分析、修复到监控的整个过程&#xff0c;确保组织能够及时发现并应对安全威胁。以下是一些建议的最佳实践&#xff1a; 发现与评估&#xff1a; 资产识别与分类&#xff1a;对组织的所有网络资产进行彻底清查&#xff0c;包括但不限…

打水问题(贪心算法)

题目&#xff1a;有n个人排队到r个水龙头去打水&#xff0c;他们装满水桶的时间t1、t2………tn为整数且各不相等&#xff0c;应如何安排他们的打水顺序才能使他们总共花费的时间最少&#xff1f;通过键盘输入排队打水的人数以及每人打水的时间和水龙头数&#xff0c;使用贪心算…

无人机GB42590接收端 +接收端模组,同时支持2.4G与5.8G双频

严格按照GB42590的协议开发的发射端&#xff0c;通过串口和模块通讯&#xff0c;默认波特率 921600。 http://www.doit.am/深圳四博智联科技有限公司https://shenzhendoit.taobao.com/category-1734422372.htm?spma1z10.1-c-s.0.0.560c74d77eT01G&searchy&catNameGB4…

【软测学习笔记】测试入门Day02

&#x1f31f;博主主页&#xff1a;我是一只海绵派大星 &#x1f4da;专栏分类&#xff1a;软件测试笔记 &#x1f4da;参考教程&#xff1a;黑马教程❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、解决穷举场景 1、等价类划分法 2、案例&#xff08;qq合法验证&…

适用于 Android 的 9 款热门视频恢复应用程序/软件 [免费和付费]

您是否曾经在毕业典礼、心爱之人的生日聚会、商务会议等重要场合用 Android 手机拍摄过视频&#xff1f;由于一旦我们丢失视频&#xff0c;您无法承受精神或经济损失&#xff0c;因此您可能需要找到适用于 Android 的最佳视频恢复应用程序来找回丢失的视频。 今天&#xff0c;…

【漏洞复现】艺创科技智能营销路由器后台命令执行漏洞

漏洞描述&#xff1a; 成都艺创科技有限公司是一家专注于新型网络设备研发、生产、销售和服务的企业&#xff0c;在大数据和云时代&#xff0c;致力于为企业提供能够提升业绩的新型网络设备。 智能营销路由器存在后台命令执行漏洞&#xff0c;攻击者可利用漏洞获取路由器控制…

JAVA面试八股文之JVM

JVM JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f;你能详细说一下 JVM 运行时数据区吗&#xff1f;详细介绍一下程序计数器的作用&#xff1f;你能给我详细的介绍Java堆吗?什么是虚拟机栈&#xff1f;栈内存溢出情况&#xff1f;堆栈的区别是什么吗&#xff1f;解…

怎么通过PHP语言实现远程控制棋牌室

怎么通过PHP语言实现远程控制棋牌室呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现控制棋牌室&#xff0c;通过专用的包间控制器&#xff0c;来实现包间内所有电器以及门锁的独立控制。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规…

linux 下的 sqlite数据库

SQLite 认识 SQLite简介 轻量化&#xff0c;易用的嵌入式数据库&#xff0c;用于设备端的数据管理&#xff0c;可以理解成单点的数据库。传统服务器型数据库用于管理多端设备&#xff0c;更加复杂 SQLite是一个无服务器的数据库&#xff0c;是自包含的。这也称为嵌入式数据库&…

otomegame游戏音频提取通用教程

otomegame游戏音频提取通用教程 文章目录 otomegame游戏音频提取通用教程一、otomegame游戏介绍二、游戏拆包与语料提取目标TTS语料积累最终目标&#xff1a; 三、游戏拆包简要介绍1&#xff0c;游戏资源提取关键词2&#xff0c;游戏拆包工具&#xff08;1&#xff09;游戏资源…

【数据结构】顺序表:与时俱进的结构解析与创新应用

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 数据结构与算法 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 一、数据结构的概念 二、顺序表&#xff08;Sequence List&#xff09; 2.1 线性表的概念以及结构 2.2 顺序表分类 …