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

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

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


文章目录

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

更多精彩内容
👉内容导航 👈
👉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 cmake中添加crashpad

cmake_minimum_required(VERSION 3.15)
# 设置 vcpkg 工具链(方法1)
# set(CMAKE_TOOLCHAIN_FILE  "D:/vcpkg/scripts/buildsystems/vcpkg.cmake")
# 设置 vcpkg 配置文件(方法2)
include("D:/vcpkg/scripts/buildsystems/vcpkg.cmake")# 设置c++17版本(需要大于C++17)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
project(test1) # 引入crashpad
find_package(crashpad CONFIG REQUIRED)  add_executable(${PROJECT_NAME} main.cpp) # 链接crashpad
target_link_libraries(${PROJECT_NAME} PRIVATE crashpad)

5 相关地址🐐

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


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

相关文章:

  • 金融Agent+LLM的特性分析与调研
  • C#并行计算(SIMD)应用
  • illustrator-02
  • 洛谷 P2568 GCD-提高+/省选−
  • 「Java EE开发指南」如何使用MyEclipse启用自动JSP验证?
  • C语言————函数递归(通俗易懂)
  • logcat 网络日志解析
  • 二、开关电源的EMC改善措施
  • Python Imaging Library (PIL) 全面指南:PIL基础入门-图像处理与数据预处理
  • Maven 编译打包一个比较有趣的问题
  • yolo学习笔记01——前置基础
  • 【力扣】2715. 执行可取消的延迟函数
  • 生产环境Vue组件报错:Cannot access before initialization
  • 将 agents 连接到 Elasticsearch 使用模型上下文协议 - docker
  • 前后端分离情况下,将本地vue项目和Laravel项目以及mysql放到自己的云服务器
  • 工业 5G + AI:智能制造的未来引擎
  • Mybatis-增删改查
  • 逻辑回归以及损失函数
  • 数字孪生(Digital Twin):未来产业与城市的智慧引擎
  • AI Agent从0到1:剖析Block与GSK的两种产品化落地路径
  • 容器学习04-kubernetes(k8s)
  • 海康相机开发---设备登录
  • (二分查找)Leetcode34. 在排序数组中查找元素的第一个和最后一个位置+74. 搜索二维矩阵
  • 【LInux】常用命令笔记
  • Linux之Shell编程(一)
  • 异步方法和多线程有什么区别,他们的实现逻辑是什么以及为什么异步方法: 不能和调用者在同一个类中
  • VisionPro联合编程控件导入WinFrom以及VS卡死问题
  • GCC版本和C语言标准版本的对应关系
  • 一个Demo射击小计(纯蓝图)
  • 前端学习 10-1 :验证中的UVM