成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
通過這個案例可以看到 PerfView 的最大好處就是無侵入性,WinDbg 和 Perfview 真的是一對好搭檔,優勢互補。

一:背景

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 真的是一對好搭檔,優勢互補。

責任編輯:武曉燕 來源: 一線碼農聊技術
相關推薦

2023-07-07 13:56:54

2023-07-24 10:54:58

CLR優化空間

2023-08-01 09:52:16

GDI泄露內存

2023-07-26 07:39:06

2013-08-19 17:25:18

.Net托管

2023-10-07 13:28:53

.NET軟件賬本

2023-09-26 01:11:58

MES非托管泄露

2010-01-06 19:22:43

.NET Framew

2011-06-21 09:38:25

托管代碼非托管代碼

2009-04-02 15:21:43

c#IDisposeFinalize

2014-07-28 10:00:47

linux系統調試句柄

2009-07-30 14:14:07

非托管COM組件

2022-09-13 17:46:19

STA模式內存

2022-10-09 10:47:37

NET視覺軟件

2010-01-06 18:27:06

.Net Framew

2010-01-25 15:55:50

托管C++

2025-05-08 03:33:00

Linuxperf.NET

2021-06-15 11:04:12

數據泄露漏洞信息安全

2022-11-15 14:29:18

2023-06-12 11:49:40

網絡交換機局域網
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本黄色的视频 | av在线免费观看网址 | 欧洲亚洲一区二区三区 | 中文字幕二区 | 久久国产精品无码网站 | 久久99精品久久久久久国产越南 | 美女久久久久久久 | 日韩毛片在线视频 | 特级做a爰片毛片免费看108 | 成人在线电影在线观看 | 久干网| 日韩成人在线观看 | 999久久精品 | av网址在线播放 | 欧美久久久久久 | h在线观看 | 蜜月aⅴ国产精品 | 欧美区在线 | 国产欧美一级 | 亚洲一区二区三区视频 | 国产做a爱片久久毛片 | 91免费电影 | 成人久久视频 | 天天干天天插 | 青娱乐自拍 | 麻豆精品一区二区三区在线观看 | 亚洲v日韩v综合v精品v | 亚洲色欧美另类 | 成人精品鲁一区一区二区 | 国产午夜精品一区二区三区 | 久久精品久久久久久 | 日韩精品一区二区三区中文在线 | 97精品国产97久久久久久免费 | 高清黄色网址 | 日本一区二区不卡 | 日韩欧美视频网站 | 亚洲综合一区二区三区 | 国产精品久久久久久久久久免费看 | 日韩欧美成人一区二区三区 | 欧美精品一区二区三区在线 | 亚洲欧美中文日韩在线v日本 |