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

2024-04-25 11:12

本文主要是介绍C++(Qt)软件调试---crashpad捕获崩溃(19),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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文件。

在这里插入图片描述

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说明

这篇关于C++(Qt)软件调试---crashpad捕获崩溃(19)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/934516

相关文章

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

IDEA如何实现远程断点调试jar包

《IDEA如何实现远程断点调试jar包》:本文主要介绍IDEA如何实现远程断点调试jar包的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录问题步骤总结问题以jar包的形式运行Spring Boot项目时报错,但是在IDEA开发环境javascript下编译

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以