調試 -> 性能查看器 -> CPU使用率 -> 開始 -> 外部代碼 -> 調用樹。
如果外部代碼中沒有啥東西,則先清理,再生成一遍。
在 Visual Studio 中獲取類似截圖中詳細的函數級耗時分析(尤其針對 DLL 中的函數),需要進行以下關鍵設置,這些設置專門針對由 EXE 主工程調用 DLL 子工程的場景:
?? ?配置步驟(EXE 和 DLL 工程共同設置)??
1. ?啟用 Release 模式分析(必須)??
- 解決方案右鍵 → ?屬性? → 頂部配置選 ?Release?
- ?每個工程單獨設置?:
- ?EXE 工程?:
配置屬性
→鏈接器
→調試
→生成調試信息
→ ?**/DEBUG
**? - ?DLL 工程?:
配置屬性
→鏈接器
→調試
→生成調試信息
→ ?**/DEBUG
**? - 同時檢查:
C/C++
→常規
→調試信息格式
→ ?**/Zi
**?
- ?EXE 工程?:
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() { ... }
- 或在探查器中手動添加分類:
- 雙擊目標函數 → ?**
添加注釋
**? → 輸入標簽
- 雙擊目標函數 → ?**
?? ?注意事項?
?DLL 函數名顯示問題?:
- 若顯示為地址(如
0x7FF8A3B1
),檢查:- PDB 文件是否在 DLL 輸出目錄
- 通過 ?**
調試
? → ?窗口
? → ?模塊
? → 右鍵 DLL → ?加載符號
**?
- 若顯示為地址(如
?多線程支持?:
- 若涉及多線程,勾選 ?**
并發
**? 分析選項:
https://docs.microsoft.com/zh-cn/cpp/media/concprof-tool.png
- 若涉及多線程,勾選 ?**
?IO/網絡操作分析?:
- 在性能探查器中額外勾選 ?**
文件 I/O
? 和 ?網絡
**? 事件 - 查看 ?**
事件
**? 視圖關聯函數調用
- 在性能探查器中額外勾選 ?**
📊 ?結果解讀技巧(匹配截圖中的表格)??
?定位高耗時函數?:
- 按 ?**
非獨占樣本數
**? 降序排序,找到LibDieToDie.dll!bfi::LineMulC2CSwathProcessor::Process
等瓶頸
- 按 ?**
?分析內核資源消耗?:
- 勾選 ?**
內核事件
**? 查看函數等待時間(如截圖中的 IO 阻塞)
- 勾選 ?**
?外部調用分析?:
- 篩選 ?**
[外部調用]
**? 列(如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 中每個函數的耗時分布和資源使用情況。