C++(Qt)軟件調試—vcpkg安裝crashpad(34)
文章目錄
- C++(Qt)軟件調試---vcpkg安裝crashpad(34)
- @[toc]
- 1 概述🐜
- 2 環境配置
- 3 qt使用crashpad庫捕獲異常
- 4 cmake中添加crashpad
- 5 相關地址🐐
文章目錄
- 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捕獲崩潰