visual studio 性能调试
调试 -> 性能查看器 -> 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 中每个函数的耗时分布和资源使用情况。