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

发布于:2025-08-31 ⋅ 阅读:(19) ⋅ 点赞:(0)

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


更多精彩内容
👉内容导航 👈
👉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";       // 设置生成minidump
    	arguments.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 相关地址🐐




网站公告

今日签到

点亮在社区的每一天
去签到