用 PerfView 洞察.NET程序非托管句柄泄露

一:背景

1. 讲故事

前几天写了一篇 如何洞察 .NET程序 非托管句柄泄露 的文章,文中使用 WinDbg 的 !htrace 命令实现了句柄泄露的洞察,在文末我也说了,WinDbg 是以侵入式的方式解决了这个问题,在生产环境中大多数情况下是不能走附加进程的模式,所以这也是它最大的局限性。

那如何以非侵入的方式解决这个问题呢?这就是本篇讨论的重点,对,就是用 CLR 团队 鼎力推荐的 Perfview 来解决这个问题,哈哈,是我昨天看文档无意发现的 😁😁😁。

二:PerfView 分析

1. 测试案例

还是用那一篇文章的例子,让 C# 和 C++ 交互的时候产生句柄泄露, C++ 代码如下:


// Example_20_1_5.cpp : This file contains the 'main' function. Program execution begins and ends there.
//extern "C"
{_declspec(dllexport) void CSharpCreateEvent();
}#include "iostream"
#include <Windows.h>using namespace std;void CSharpCreateEvent()
{HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);printf("\nEvent句柄值: %#08x	", hEvent);}

在 C# 中我用 Task 的形式调用 CSharpCreateEvent 函数来产生 Event 句柄泄露,参考代码如下:

internal class Program{[DllImport("Example_20_1_5", CallingConvention = CallingConvention.Cdecl)]extern static void CSharpCreateEvent();static void Main(string[] args){try{while (true){Task.Run(() =>{CSharpCreateEvent();});Thread.Sleep(10);}}catch (Exception ex){Console.WriteLine(ex.Message);}Console.ReadLine();}}

2. Handle 分配监控

在 perfview 中可以开启内核级别的 OS Handle ETW事件 来进行分配和释放监控,用 +1-1 表示,为了让事件产生的更少,在 Focus process 中指定 Example_20_1_4.exe ,并且选中 Handle 复选框,截图如下:

如果嫌面板太麻烦,可以使用 /KernelEvents:Handle,Default 命令即可,完整的 Command 命令如下:


PerfView.exe  "/DataFile:PerfViewData.etl" /BufferSizeMB:256 /StackCompression /CircularMB:500 /KernelEvents:Handle,Default /NoGui /FocusProcess:"Example_20_1_4.exe" /NoNGenRundown collect

接下来点击 Start Collection 开启收集,收集一会之后点击 Stop Collection,生成好 Zip 之后选择 Advanced -> Windows Handle Ref Count Stacks 选项,在弹出面板中选择我们的 Example_20_1_4 程序,删除 GroupPats 分组信息,处理后的截图如下:

从上面的面板信息的 Handle Type Event 来看,当前有 5445 个 Event 事件没有被 Close,原来是 Event事件 的泄露哈,接下来在右键面板中选择 Goto -> Item in Callers 选项可以看到每一个 Event 的详细列表。

最后就是抽选其中几个,观察到底是什么代码创建的 Event ? 截图如下:

仔细观察面板信息,可以清楚的看到,原来是 Main 函数中有一个匿名方法,它在内部调用了 Example_20_1_5!CSharpCreateEvent 方法来创建句柄。

到这里就真相大白了。

三:总结

通过这个案例可以看到 PerfView 的最大好处就是无侵入性,WinDbg 和 Perfview 真的是一对好搭档,优势互补。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/27015.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习(28)——YOLO系列(7)

深度学习&#xff08;28&#xff09;——YOLO系列&#xff08;7&#xff09; 咱就是说&#xff0c;需要源码请造访&#xff1a;Jane的GitHub&#xff1a;在这里 上午没写完的&#xff0c;下午继续&#xff0c;是一个小尾巴。其实上午把训练的关键部分和数据的关键部分都写完了…

青岛大学_王卓老师【数据结构与算法】Week05_07_顺序栈的操作1_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c; 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础…

SqlServer数据库【基础-更删改查】

一、创建语句 &#xff08;1&#xff09;创建数据库 1.检查系统中是否存在这个数据库&#xff0c;存在则删除 格式&#xff1a; if exists(select * from sysdatabases where name数据库名) drop database 数据库名 go例子&#xff1a; if exists(select * from sysdataba…

Go语言之函数补充defer语句,递归函数,章节练习

defer语句是go语言提供的一种用于注册延迟调用的机制&#xff0c;是go语言中一种很有用的特性。 defer语句注册了一个函数调用&#xff0c;这个调用会延迟到defer语句所在的函数执行完毕后执行&#xff0c;所谓执行完毕是指该函数执行了return语句、函数体已执行完最后一条语句…

基于SpringBoot+vue的校园闲置物品租售系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

h5live 2.0.1 合入测试

直接超过1个G 有消息进来&#xff0c;就是不显示

2023年知识库软件爆火的有哪些?

2023年知识库软件爆火的可能性有很多&#xff0c;以下是一些可能的候选者&#xff1a; 一、Baklib&#xff1a;Baklib是一款新兴的知识库软件&#xff0c;它提供了强大的知识管理和组织功能。它能够帮助用户收集、整理和共享知识&#xff0c;并提供智能搜索和推荐引擎&#xf…

Docker容器常用命令大全:熟练掌握使容器优化更加高效

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

微服务-Nacos环境安装

文章目录 1. 微服务1.1 微服务概括 2. 微服务框架2.1 Spring Cloud2.2 Spring Cloud alibaba/Spring Cloud Netflix2.3微服务框架组件(alibaba) 3 Nacos3.1 Nacos介绍3.3 Naocs工作结构3.3 Nacos功能3.4 环境准备下载安装 1. 微服务 1.1 微服务概括 单体架构有问题,所以做项目…

设计模式之桥接模式

写在前面 本文看下桥接设计模式。 1&#xff1a;介绍 1.1&#xff1a;什么时候桥接设计模式 当一个业务场景由多个变化维度组成&#xff0c;并且这多个变化的维度到底有多少种情况是不确定&#xff0c;比如现在我们要为瑞幸咖啡写一个系统&#xff0c;很自然的&#xff0c;…

云计算的学习(四)

四、云计算中的存储基础知识 1.云计算虚拟化中的存储架构 ①虚拟化存储 在虚拟化存储架构中&#xff0c;最底层为物理磁盘。 底层的硬件组成存储池&#xff0c;存储池分为NAS存储和SAN存储&#xff1b;NAS存储需要文件系统&#xff1b;SAN存储需要对存储池进行逻辑划分产生逻…

Stability AI 把绘画门槛打为 0!

本文由 GPT- 4 所创作&#xff0c;配图由 Stable Doodle 生成。 编者按 Stability AI 上新了&#xff01; 其收购的 Clipdrop 发布了全新的 Stable Doodle 工具&#xff0c;我在使用后最为直观的感受就是 —— 把绘画门槛打下来了。 在 Stable Doodle 之前&#xff0c;使用各…