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.pswp.cn/web/94984.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94984.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94984.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kafka 副本同步異常與 ISR 收縮故障排查實錄

背景 某高流量 Kafka 集群&#xff08;原 10G 網卡&#xff09;在切中心時頻繁觸發帶寬報警&#xff0c;擴容至 25G 網卡后出現副本同步異常&#xff1a; 操作流程&#xff1a;停機→升級網卡→重啟→觸發分區同步→切換首選 Leader現象&#xff1a; 寫入流量上升后&#xff0c…

頂點 (VS)vs 片段(FS):OpenGL紋理滾動著色器的性能博弈與設計哲學

一個微妙的選擇&#xff0c;影響整個應用性能表現在實時圖形渲染中&#xff0c;實現紋理滾動效果是一種常見需求。但當我們在頂點著色器和片段著色器之間做出不同實現選擇時&#xff0c;會對性能產生顯著影響。今天&#xff0c;我們將深入探討這兩種實現的差異&#xff0c;幫助…

基于博客系統的自動化測試項目

目錄 一、引言 二、項目背景 三、項目功能 1&#xff09;初始登錄界面 2&#xff09;博客首頁 3&#xff09;博客詳情頁 4&#xff09;博客編輯頁 四、測試工具 1&#xff09;基礎操作系統環境 2&#xff09;瀏覽器環境 3&#xff09;開發與測試工具環境 4&#xf…

R 語言 eulerr 包繪制韋恩圖:比例精準

在數據可視化中,韋恩圖是展示多組數據交集關系的常用工具,尤其在生物信息(如基因差異表達分析)、統計分析等領域高頻使用。但傳統繪圖工具常面臨橢圓比例失衡、數值顯示混亂、樣式調整繁瑣等問題,而 R 語言的eulerr包恰好能解決這些痛點 —— 它支持按數據比例自動適配圖形…

CRYPT32!CryptMsgUpdate函數分析和asn.1 editor nt5inf.cat 的總覽信息

0000: 30 83 09 69 2f ; SEQUENCE (9692f Bytes) 0005: 06 09 ; OBJECT_IDENTIFIER (9 Bytes) 0007: | 2a 86 48 86 f7 0d 01 07 02| ; "PKCS 7 已簽名 (1.2.840.113549.1.7.2)" 0010: …

04數據庫約束實戰:從入門到精通

感謝黑馬程序員提供的免費課程約束概念&#xff1a;約束是作用于表中字段上的規則&#xff0c;用于限制存儲在表中的數據。目的&#xff1a;保證數據庫中數據的正確、有效性和完整性。常見的幾種約束&#xff1a;注意&#xff1a;約束是作用于表中字段上的&#xff0c;可以在創…

WPF+IOC學習記錄

最近在學WPF&#xff0c;上一篇文章記錄了WPF的MVVM自己實現和用框架的區別&#xff08;WPFMVVM入門學習&#xff09;&#xff0c;接下這篇文章記錄一下在WPF中使用IOC&#xff0c;這里演示用的是微軟官方的DependencyInjection&#xff0c;也可以用其他的第三方框架。 項目源…

從零開始學習單片機16

STM32單片機STM32和51單片機的區別51單片機的外設資源少&#xff0c;寄存器少&#xff0c;運行速度慢&#xff0c;價格便宜&#xff0c;容易上手STM32單片機的外設資源更多&#xff0c;寄存器多&#xff0c;運行速度相對快&#xff0c;價格相對貴&#xff0c;上手相對較難STM32…

[特殊字符]論一個 bug 如何經過千難萬險占領線上

謹以此文獻給每一個曾與 Bug 搏斗、最終卻目睹它成功上線的你 本文旨在揭露 Bug 的狡猾&#xff0c;絕非鼓勵以下行為。若你照做&#xff0c;后果自負&#x1f436;每一個在線上逍遙法外的 Bug&#xff0c;都不是偶然。它是一場精心策劃的奇跡&#xff0c;是開發、聯調、測試、…

Day12-python文件操作(二)

目錄前言一、Excel文檔操作1.1、xlrd和xlwt庫1.2、openpyxl庫1.3、pandas庫總結前言 今天繼續學習文件操作相關內容&#xff0c;為后續辦公自動化打基礎。 一、Excel文檔操作 1.1、xlrd和xlwt庫 如果要兼容 Excel 2007 以前的版本&#xff0c;也就是xls格式的 Excel 文件&am…

CollageIt:簡單易用的照片拼貼工具

在數字圖像處理領域&#xff0c;制作照片拼貼是一種常見的創意表達方式。CollageIt作為一款體積小巧、簡單易用的照片拼貼工具&#xff0c;能夠幫助用戶輕松將多張圖片拼合成一張精美的拼貼畫。它不僅操作簡單&#xff0c;還支持多種圖片格式&#xff0c;確保用戶可以快速制作出…

Java全棧工程師的實戰面試:從基礎到微服務的全面解析

Java全棧工程師的實戰面試&#xff1a;從基礎到微服務的全面解析 一、開場介紹 面試官&#xff1a;你好&#xff0c;歡迎來到我們公司。我是今天的面試官&#xff0c;負責技術部分的評估。請先簡單介紹一下你自己。 應聘者&#xff1a;您好&#xff0c;我叫李明&#xff0c;25歲…

驅動開發系列68 - GLSL編譯器實現 - 算數指令折疊及訪存優化

一 : 指令合并概述 指令折疊的意思,原本一個語句會產生多條指令,通過折疊,可以刪除一些中間指令,減少指令數量,并且能夠減少寄存器占用。提高執行效率。 舉一個例子: MUL A, B, 4 ; A = B * 4MAD D, A, 2, F ; D = A * 2 + F MAD G, A, 3, I ; G …

深入解析Qt節點編輯器框架:高級特性與性能優化(四)

文章目錄一、高級交互特性&#xff1a;超越基礎操作的用戶體驗提升1. 節點組管理&#xff1a;折疊與嵌套的層級組織2. 智能連接線路由&#xff1a;避免交叉與視覺混亂3. 批量操作與快捷鍵&#xff1a;提升操作效率二、性能優化&#xff1a;應對大規模節點場景的核心策略1. 圖形…

Python 入門操作指南

引言 Python 是一種簡單易學卻功能強大的編程語言,廣泛應用于數據分析、人工智能、Web 開發等領域。對于初學者而言,掌握 Python 的入門操作是邁向編程世界的第一步。本文將以總分總的結構,系統介紹 Python 的安裝方法、推薦的開發工具、第一個 Python 程序示例,以及包管理…

ZooKeeper 安裝配置

前言 有時會需要安裝開源的大數據集群進行測評或者驗證問題&#xff0c;已經裝過很多遍了&#xff0c;所以想系統的總結整理一下各個組件的安裝部署&#xff0c;包括 Zookeeper、Hadoop、Hive、Spark 等。 版本 Zookeeper 3.5.6 3.8.4 3.9.3 初始化 包括主機名修改、SSH互…

考研數據結構Part3——二叉樹知識點總結

一、前言 二叉樹是一種特殊的樹形結構&#xff0c;每個節點最多有兩個子節點&#xff0c;分別稱為左子樹和右子樹。其特點是子樹有嚴格的左右之分&#xff0c;順序不可顛倒。從歷年真題來看&#xff0c;二叉樹的鏈式存儲實現、遍歷算法、屬性統計是高頻考點&#xff0c;常以選擇…

網絡與信息安全有哪些崗位:(12)威脅分析師

今天是七夕節&#xff0c;首先祝大家早遇良緣、有情人終成眷屬&#xff01;&#xff01;七夕節快樂、工作順利、學業有成~~ 想知道網絡與信息安全領域有哪些具體崗位嗎&#xff1f;此前我們已陸續介紹網絡安全工程師、滲透測試工程師、SOC 總監、SOC 工具運維工程師等核心角色&…

mysql雙機熱備(主主模式)

一、環境準備 主機名ip操作系統備注node01192.168.48.91CentOS Linux 7 (Core)mysql主庫node01192.168.48.92CentOS Linux 7 (Core)mysql主庫192.168.48.90漂移IP&#xff08;VIP&#xff09; centos7鏡像下載地址&#xff1a; https://mirrors.aliyun.com/centos/7.9.2009/…

微積分 | 積分代換

注&#xff1a;本文為 “微積分 | 積分代換法 ” 相關合輯。 英文引文&#xff0c;機翻未校&#xff0c; 中文引文&#xff0c;略作重排。 未去重&#xff0c;如有內容異常&#xff0c;請看原文。 Integration by Substitution 積分代換法 May 23, 2018 / By Dave Peterson …