当前位置: 首页 > news >正文

C++(Qt)软件调试---vspkg安装crashpad(34)

C++(Qt)软件调试—vspkg安装crashpad(34)


文章目录

  • C++(Qt)软件调试---vspkg安装crashpad(34)
    • @[toc]
    • 1 概述🐜
    • 2 环境配置
    • 3 qt使用crashpad库捕获异常
    • 4 相关地址🐐

更多精彩内容
👉内容导航 👈
👉C++软件调试 👈

1 概述🐜

前面讲了如何使用crashpad捕获C++程序异常,生成dump文件用于分析;

由于之前文章中的编译好的crashpad下载地址失效,自己编译又比较复杂,并且地址在外网,所以本文主要讲如何使用vcpkg来构建安装crashpad库。

Crashpad 是 Google 开源的跨平台崩溃收集和转储(dump)工具,主要用于自动捕获程序异常(如崩溃、未处理异常),生成 minidump 文件,并可自动上传到远程服务器进行分析。

它常用于 Windows、Linux、macOS 等系统的 C++ 应用,Chrome 浏览器和许多 Google 产品都在用。

主要功能:

  • 自动捕获崩溃(如访问违规、断言失败等)
  • 生成 minidump 文件(包含崩溃时的内存、寄存器等信息)
  • 支持自定义注释、附加信息
  • 可自动上传 dump 到远程服务器
  • 支持多平台(Windows、Linux、macOS)

vcpkg 是一个由微软开发的开源 C/C++ 包管理工具,主要用于简化在 Windows、Linux 和 macOS 上安装和管理 C/C++ 库的过程。

它可以自动下载、编译并集成第三方库到你的项目中,支持 Visual Studio、CMake 等主流开发环境。

环境说明
系统windows10
vs版本2022
梯子GreenHub

2 环境配置

  • 下载vcpkg:下载地址,或者使用命令git clone https://github.com/microsoft/vcpkg.git下载;

  • 下载完成后讲vcpkg路径添加进环境变量,方便使用;

    在这里插入图片描述

  • 使用管理员打开powerShell,不要用cmd;

  • 运行bootstrap-vcpkg.bat脚本下载vcpkg.exe;

  • 可以使用vcpkg search crashpad命令查询包的信息或者进入vcpkg网站查询;

    在这里插入图片描述

  • 然后运行vcpkg install crashpad命令进行安装,安装完成后包位于D:\vcpkg\packages\crashpad_x64-windows路径下;(系统中需要安装有vs编译工具)

  • 或者创建一个C++工程,在工程路径下创建vcpkg.json文件,如下所示;

    {"name": "untitled5","version-string": "1.0.0","dependencies": ["crashpad"]
    }
    
  • 然后powershell进入工程路径下,运行vcpkg install命令,安装完成后包就位于工程路径下;

    在这里插入图片描述

  • vcpkg_installed\x64-windows\lib路径下为Release版本库;

  • vcpkg_installed\x64-windows\debug\lib路径下为debug版本库;

  • vcpkg_installed\x64-windows\include路径为头文件;

  • vcpkg_installed\x64-windows\tools\crashpad路径下为crashpad_handler独立进程,负责实际 dump 生成和上传。

3 qt使用crashpad库捕获异常

  • 创建一个qt工程;

  • 在工程路径下使用vcpkg安装crashpad库;

  • 打开pro文件,添加项目代码(debug版本),除了crashpad的库外,需要注意的是还需要添加Advapi32这个库;

    
    LIBS += -L$$PWD/vcpkg_installed/x64-windows/debug/lib/ -lvcpkg_crashpad_base\-lvcpkg_crashpad_client\-lvcpkg_crashpad_client_common\-lvcpkg_crashpad_util\-lzlibd\-lAdvapi32  # 注意,必须添加INCLUDEPATH += $$PWD/vcpkg_installed/x64-windows/include
    DEPENDPATH += $$PWD/vcpkg_installed/x64-windows/include
    
  • 打开main.cpp文件,添加下面测试代码;

    #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;
    }
  • 编译生成可执行程序,然后将vcpkg_installed\x64-windows\tools\crashpad中的文件拷贝到可执行程序路径下;

    在这里插入图片描述

  • 双击运行测试程序,出现异常后会在crash\reports路径下生成dump文件;

4 相关地址🐐

  • vcpkg下载地址
  • vcpkg - 来自 Microsoft 的开源 C/C++ 依赖项管理器
  • vcpkg.json 参考 | Microsoft Learn
  • C++(Qt)软件调试—crashpad捕获崩溃


http://www.dtcms.com/a/355406.html

相关文章:

  • 浅谈 Java 中的 import static 使用方式
  • Docker 是什么?
  • RabbitMQ-高级特性
  • 机器视觉学习-day09-图像矫正
  • 客户预充值系统(一) - 数据库设计与数据插入
  • JVM——八股文
  • curl、python-requests、postman和jmeter的对应关系
  • DJI无人机云哨DroneID技术解析:天空中的数字身份证
  • 2025年KBS SCI1区TOP,矩阵差分进化算法+移动网络视觉覆盖无人机轨迹优化,深度解析+性能实测
  • Maven核心用法
  • ubuntu挂载外接硬盘
  • IDEA 中创建 Springboot 项目没有 Java8 选项的解决办法
  • 介绍智慧城管十大核心功能之一:风险预警系统
  • 关于npm安装electron和better-sqlite3失败问题
  • Copilot、Cursor、Trae、ChatGPT 的“四件套”场景选择表
  • 第六届智能计算与人机交互国际研讨会(ICHCI 2025)
  • MySQL 与 ClickHouse 深度对比:架构、性能与场景选择指南
  • 【数字IC后端】引导时钟树CTS的生成方向之anchor driver
  • 详细介绍Linux 内存管理struct page数据结构中的_count和_mapcount有什么区别?
  • Pyomo、PuLP 和 OR-Tools 解决约束优化问题效率对比
  • C# SIMD编程实践:工业数据处理性能优化案例
  • 基于SpringBoot的校园资料分享系统【2026最新】
  • 数据结构-哈夫曼树和B树
  • 安宝特方案丨安宝特工业AR全链路解决方案
  • Centos 8 磁盘扩展xfs文件系统 (LVM)
  • 利用 Java 爬虫获取 AQI 详情数据(代码示例)实战指南
  • 如何使用Windows自带的PnPUtil命令来禁用/停用和启用硬件设备
  • VPC私有域名解析DNS
  • 使用 Action 自动部署 VuePress 到 GitHub Pages
  • GRE隧道IPv6过渡技术