调试 -> 性能查看器 -> 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 架构和微架构架构不…