visual studio 性能調試

調試 -> 性能查看器 -> CPU使用率 -> 開始 -> 外部代碼 -> 調用樹。

如果外部代碼中沒有啥東西,則先清理,再生成一遍。

在 Visual Studio 中獲取類似截圖中詳細的函數級耗時分析(尤其針對 DLL 中的函數),需要進行以下關鍵設置,這些設置專門針對由 EXE 主工程調用 DLL 子工程的場景:


?? ?配置步驟(EXE 和 DLL 工程共同設置)??

1. ?啟用 Release 模式分析(必須)??
  • 解決方案右鍵 → ?屬性? → 頂部配置選 ?Release?
  • ?每個工程單獨設置?:
    • ?EXE 工程?:配置屬性鏈接器調試生成調試信息 → ?**/DEBUG**?
    • ?DLL 工程?:配置屬性鏈接器調試生成調試信息 → ?**/DEBUG**?
    • 同時檢查:C/C++常規調試信息格式 → ?**/Zi**?
2. ?生成完整符號文件(PDB)??
  • 在 DLL 工程屬性中:
    • 鏈接器調試 → ?**生成程序數據庫文件**? → 設置路徑(如 $(OutDir)MyDLL.pdb
  • EXE 工程需指定加載 DLL 的 PDB:
    • 在代碼中顯式加載(推薦):
      // EXE 主函數初始化時添加
      SymSetOptions(SYMOPT_DEFERRED_LOADS | SYMOPT_LOAD_LINES);
      SymInitialize(GetCurrentProcess(), NULL, TRUE);
      SymLoadModuleEx(GetCurrentProcess(), NULL, "LibDieToDie.dll", 0, 0, 0, 0, 0);
3. ?啟動性能探查器?
  • 菜單:?調試? → ?性能探查器? (Alt+F2)
  • 選擇 ?CPU 使用率? → ?齒輪圖標? → 配置如下:
    • ?采樣間隔?:0.5ms(獲取更精確的短函數耗時)
    • ?啟用層交互分析?:勾選(顯示 EXE 調用 DLL 關系)
  • 勾選 ?**.NET 和本機調試**?

🔍 ?針對 DLL 分析的專屬設置?

1. ?**配置模塊過濾
  • 在性能探查器底部點擊 ?**配置分析目標**?
  • 添加 DLL 模塊:?**添加特定模塊**? → 輸入 LibDieToDie.dll
  • ?排除系統 DLL?:
    ntdll.dll;KERNELBASE.dll;ucrtbase.dll
2. ?層級調用關系可視化(匹配截圖中的層級)??
  • 分析完成后,在報告中選擇 ?**調用樹**? 視圖
  • 右鍵表頭 → ?**添加/刪除列**? → 勾選:
    • ?模塊名稱?
    • ?獨占樣本數?(函數自身耗時)
    • ?非獨占樣本數?(含子函數耗時)
3. ?標記高耗時函數類型(如截圖中的 IO/網絡/圖形)??
  • 在代碼中對關鍵函數添加注釋標記:
    // [[vc::annotation("網絡|圖形|內核")]]
    void LibDieToDie::Process() { ... }
  • 或在探查器中手動添加分類:
    • 雙擊目標函數 → ?**添加注釋**? → 輸入標簽

?? ?注意事項?

  1. ?DLL 函數名顯示問題?:

    • 若顯示為地址(如 0x7FF8A3B1),檢查:
      • PDB 文件是否在 DLL 輸出目錄
      • 通過 ?**調試? → ?窗口? → ?模塊? → 右鍵 DLL → ?加載符號**?
  2. ?多線程支持?:

    • 若涉及多線程,勾選 ?**并發**? 分析選項:
      https://docs.microsoft.com/zh-cn/cpp/media/concprof-tool.png
  3. ?IO/網絡操作分析?:

    • 在性能探查器中額外勾選 ?**文件 I/O? 和 ?網絡**? 事件
    • 查看 ?**事件**? 視圖關聯函數調用

📊 ?結果解讀技巧(匹配截圖中的表格)??

  1. ?定位高耗時函數?:

    • 按 ?**非獨占樣本數**? 降序排序,找到 LibDieToDie.dll!bfi::LineMulC2CSwathProcessor::Process 等瓶頸
  2. ?分析內核資源消耗?:

    • 勾選 ?**內核事件**? 查看函數等待時間(如截圖中的 IO 阻塞)
  3. ?外部調用分析?:

    • 篩選 ?**[外部調用]**? 列(如 opencv_world470.dll
    • 檢查是否有第三方庫性能問題

??:截圖中的 "IO | 網絡 | 圖形" 標簽可通過代碼注解或手動添加獲得


💻 完整分析流程示例

graph TD
A[設置Release模式] --> B[生成EXE/DLL的PDB]
B --> C[啟動性能探查器]
C --> D{配置分析目標}
D --> E1[指定LibDieToDie.dll]
D --> E2[排除系統DLL]
E1 --> F[執行目標操作]
F --> G[分析報告]
G --> H1[調用樹視圖]
G --> H2[函數耗時排序]
G --> H3[資源標簽標注]

按照此配置運行后,您將得到與截圖完全一致的分析報告,清晰展示 DLL 中每個函數的耗時分布和資源使用情況。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90490.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90490.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90490.shtml

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

相關文章

Java JVM

前言 JVM是Java的重要組成部分,對于我這個Cpper轉Javaer也需要認真學習才對。 一、JVM內存結構 #mermaid-svg-rYtbHArIPV8iAK9I {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-rYtbHArIPV8iAK9I .erro…

便捷刪除Android開發中XML中重復字符串資源的一個辦法

從android系統源碼中移植一些app到android studio開發的時候可能會遇到字符串重復的編譯報錯。一個辦法是把重復的刪除,只剩余一條即可。例如下面的編譯錯誤:Found item String/abc more than one time但是呢,xml中一般這種重復的很多很多&am…

免模型控制

文章目錄免模型控制Q-Learning 算法原理Sarsa 算法區別:免模型控制 免模型控制要解決的問題是,如何選擇動作以達到最高得分 Q-Learning 算法 原理 首先Q-Learning 確定了一個前提最優策略:π(s)arg?max?aQ(s,a)\pi(s) \arg\max_a Q(s,…

Vmware VSAN主機停機維護流程

當VSAN主機由于故障或進行擴容操作需要停機維護時,在關閉ESXi主機前和啟動ESXi主機后需要進行一些必要的檢查操作,以免對vSAN集群環境造成不可預知的風險,影響集群中的虛擬機運行。以下是vSAN集群中的ESXi主機停機維護的主要步驟。 1.確認受影…

中小企業安全落地:低成本漏洞管理與攻擊防御方案

中小企業普遍面臨 “預算有限、技術人員不足” 的困境,安全建設常陷入 “想做但做不起” 的尷尬。事實上,中小企業無需追求 “高大上” 的安全方案,通過 “開源工具 簡化流程 聚焦核心” 的思路,即可用低成本實現有效的漏洞管理…

面試150 搜索二維矩陣

思路1 直接遍歷搜尋,逐個判斷即可 class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:mlen(matrix)nlen(matrix[0])for i in range(m):for j in range(n):if matrix[i][j]target:return Truereturn False思路2 Z字形搜索從矩…

npm init vite-app runoob-vue3-test2 ,npm init vue@latest,指令區別

這兩個命令都是用于創建 Vue.js 項目的腳手架命令,但它們在技術棧、配置方式和項目結構上有顯著區別:1. npm init vite-app runoob-vue3-test2技術棧:基于 Vite 構建工具使用 Vue 3 作為默認框架由 Vite 團隊維護特點:bash復制代碼…

WPF MVVM進階系列教程(二、數據驗證)

五一出去浪吹風著涼了,今天有點發燒😷 手頭的工作放一放,更新一下博客吧。 什么是數據驗證(Validation) 數據驗證是指用于捕獲非法數值并拒絕這些非法數值的邏輯。 大多數采用用戶輸入的應用都需要有驗證邏輯,以確保用戶已輸入…

AI 音頻產品開發模板及流程(二)

AI 音頻產品開發模板及流程(一) 6. 同聲傳譯 實時翻譯,發言與翻譯幾乎同步,極大提升溝通效率。支持多語言互譯,適用于國際會議、商務洽談等多場景。自動斷句、轉寫和翻譯,減少人工干預,提升準…

kafka4.0集群部署

kafka4.0是最新版kafka,可在kafka官網下載,依賴的jdk版本要求在jdk17及jdk17以上tar -xzf kafka_2.13-4.0.0.tgzmv kafka_2.13-4.0.0 kafkacd kafka# 隨便一臺節點運行生成隨機uuid,后面每臺節點都要使用此uuidbin/kafka-storage.sh random-u…

【News】同為科技亮相首屆氣象經濟博覽會

7月18日,由中國氣象服務協會主辦的國內首個以“氣象經濟”為核心的國家級博覽會——首屆氣象經濟博覽會(以下簡稱“博覽會”)在合肥濱湖國際會展中心開幕。北京同為科技有限公司(TOWE)作為雷電防護領域的技術領導企業&…

數據結構 堆(2)---堆的實現

上篇文章我們詳細介紹了堆和樹的基本概念以及它們之間的關系,還要知道一般實現堆的方式是使用順序結構的數組進行存儲數據及實現。下來我們看看利用順序結構的數組如何實現對的內容:1.堆的實現關于堆的實現,也是三個文件,頭文件,實…

Arraylist與LinkedList區別

📚 歡迎來到我的Java八股文專欄! 🎉各位程序員小伙伴們好呀~ 👋 我是雪碧聊技術,很高興能在CSDN與大家相遇!?🚀 專欄介紹這個專欄將專注于分享Java面試中的經典"八股文"知識點 &…

Java實戰:基于Spring Cloud的電商微服務架構設計——從拆分到高可用的全流程解析

引言 2023年雙十一大促期間,某傳統電商平臺的單體應用再次“爆雷”:凌晨1點訂單量突破50萬單/分鐘時,用戶服務因數據庫連接池被訂單模塊占滿,導致登錄接口響應時間從200ms飆升至5秒,大量用戶流失。技術團隊緊急回滾后發現:這個運行了7年的單體應用,早已變成“代碼泥潭”…

STL學習(二、vector容器)

1.vector構造函數函數原型vector<int> v // 默認構造&#xff0c;size為0vector(const_iterator beg, const_iterator end) // 將v的[begin, end) 元素拷貝過來vector(n, elem) // 構造函數將n個elem拷貝到本身vector(const vector & v) // 拷貝構造2.vect…

深度學習-算子

概念&#xff1a;標識數字圖像中亮度變化明顯的點處理步驟1.濾波處理算子通常被稱為濾波器。2.增強確定各點sobel算子概念&#xff1a;主要用于獲得數字圖像的一階梯度&#xff0c;本質是梯度運算。Scharr算子Scharr算子 是一種用于邊緣檢測的梯度算子&#xff0c;它是Sobel算子…

全國產8通道250M AD FMC子卡

4片8路ADS42LB69標準FMC采集子卡自研成品ADC采集子卡和定制化設計ADC采集子卡&#xff0c;實測采集指標均與手冊標稱值一致。該板卡有全國產化和進口兩個版本&#xff0c;基于FMC標準設計&#xff0c;實現8路16bit/250MSPS ADC采集功能&#xff0c;遵循 VITA 57 標準&#xff0…

【牛客網C語言刷題合集】(三)

&#x1f31f;菜鳥主頁&#xff1a;晨非辰的主頁 &#x1f440;學習專欄&#xff1a;《C語言刷題集》 &#x1f4aa;學習階段&#xff1a;C語言方向初學者 ?名言欣賞&#xff1a;"任何足夠先進的bug都與魔法無異。" 前言&#xff1a;刷題博客主要記錄在學習編程語言…

Python之--字典

定義字典&#xff08;dict&#xff09;是一種無序、可變且可哈希的數據結構&#xff0c;字典是根據一個信息來查找另一個信息&#xff0c;它表示索引用的鍵和對應的值構成的成對關系。特點&#xff08;1&#xff09;字典與列表一樣&#xff0c;是Python里面的可變數據類型。&am…

【ARM】ARM微架構

1、 文檔目標對 ARM 微架構的概念有初步的了解。2、 問題場景在和客戶溝通和新同事交流時對于 ARM 架構和微架構二者有什么區別和聯系&#xff0c;做一個簡單的介紹。3、軟硬件環境1、軟件版本&#xff1a;不涉及2 、電腦環境&#xff1a;不涉及4、關于 ARM 架構和微架構架構不…