visual studio 性能调试

发布于:2025-07-23 ⋅ 阅读:(17) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到