国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價值的文章主要介紹了用 PerfView 洞察.NET程序非托管句柄泄露。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一:背景

1. 講故事

前幾天寫了一篇 如何洞察 .NET程序 非托管句柄泄露 的文章,文中使用 WinDbg 的 !htrace 命令實現(xiàn)了句柄泄露的洞察,在文末我也說了,WinDbg 是以侵入式的方式解決了這個問題,在生產(chǎn)環(huán)境中大多數(shù)情況下是不能走附加進程的模式,所以這也是它最大的局限性。

那如何以非侵入的方式解決這個問題呢?這就是本篇討論的重點,對,就是用 CLR 團隊 鼎力推薦的 Perfview 來解決這個問題,哈哈,是我昨天看文檔無意發(fā)現(xiàn)的 ??????。

二:PerfView 分析

1. 測試案例

還是用那一篇文章的例子,讓 C# 和 C++ 交互的時候產(chǎn)生句柄泄露, 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 的形式調(diào)用 CSharpCreateEvent 函數(shù)來產(chǎn)生 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 分配監(jiān)控

在 perfview 中可以開啟內(nèi)核級別的 OS Handle ETW事件 來進行分配和釋放監(jiān)控,用 +1-1 表示,為了讓事件產(chǎn)生的更少,在 Focus process 中指定 Example_20_1_4.exe ,并且選中 Handle 復(fù)選框,截圖如下:

用 PerfView 洞察.NET程序非托管句柄泄露,.net,windbg,c#,perfview

如果嫌面板太麻煩,可以使用 /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 分組信息,處理后的截圖如下:

用 PerfView 洞察.NET程序非托管句柄泄露,.net,windbg,c#,perfview

從上面的面板信息的 Handle Type Event 來看,當(dāng)前有 5445 個 Event 事件沒有被 Close,原來是 Event事件 的泄露哈,接下來在右鍵面板中選擇 Goto -> Item in Callers 選項可以看到每一個 Event 的詳細列表。

用 PerfView 洞察.NET程序非托管句柄泄露,.net,windbg,c#,perfview

最后就是抽選其中幾個,觀察到底是什么代碼創(chuàng)建的 Event ? 截圖如下:

用 PerfView 洞察.NET程序非托管句柄泄露,.net,windbg,c#,perfview

仔細觀察面板信息,可以清楚的看到,原來是 Main 函數(shù)中有一個匿名方法,它在內(nèi)部調(diào)用了 Example_20_1_5!CSharpCreateEvent 方法來創(chuàng)建句柄。

到這里就真相大白了。

三:總結(jié)

通過這個案例可以看到 PerfView 的最大好處就是無侵入性,WinDbg 和 Perfview 真的是一對好搭檔,優(yōu)勢互補。文章來源地址http://www.zghlxwxcb.cn/news/detail-578720.html

到了這里,關(guān)于用 PerfView 洞察.NET程序非托管句柄泄露的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • PerfView 洞察C#托管堆內(nèi)存 "黑洞現(xiàn)象"

    PerfView 洞察C#托管堆內(nèi)存 "黑洞現(xiàn)象"

    首先聲明的是這個 黑洞 是我定義的術(shù)語,它是用來表示 內(nèi)存吞噬 的一種現(xiàn)象,何為 內(nèi)存吞噬 ,我們來看一張圖。 從上面的 卦象圖 來看,GCHeap 的 Allocated=852M 和 Committed=16.6G ,它們的差值就是 分配緩沖區(qū)=16G ,緩沖區(qū)的好處就是用空間換時間,弊端就是會實實在在的侵占內(nèi)

    2024年02月16日
    瀏覽(21)
  • PerfView專題 (第十六篇): 如何洞察C#托管堆內(nèi)存的 "黑洞現(xiàn)象"

    PerfView專題 (第十六篇): 如何洞察C#托管堆內(nèi)存的 "黑洞現(xiàn)象"

    首先聲明的是這個 黑洞 是我定義的術(shù)語,它是用來表示 內(nèi)存吞噬 的一種現(xiàn)象,何為 內(nèi)存吞噬 ,我們來看一張圖。 從上面的 卦象圖 來看,GCHeap 的 Allocated=852M 和 Committed=16.6G ,它們的差值就是 分配緩沖區(qū)=16G ,緩沖區(qū)的好處就是用空間換時間,弊端就是會實實在在的侵占內(nèi)

    2024年02月16日
    瀏覽(18)
  • 記一次 .NET某賬本軟件 非托管泄露分析

    記一次 .NET某賬本軟件 非托管泄露分析

    中秋國慶長假結(jié)束,哈哈,在老家拍了很多的短視頻,有興趣的可以上B站觀看:https://space.bilibili.com/409524162 ,今天繼續(xù)給大家分享各種奇奇怪怪的.NET生產(chǎn)事故,希望能幫助大家在未來的編程之路上少踩坑。 話不多說,這篇看一個 .NET程序集泄露 導(dǎo)致的CLR私有堆泄露的案例,

    2024年02月08日
    瀏覽(26)
  • 記一次 .NET某收銀軟件 非托管泄露分析

    記一次 .NET某收銀軟件 非托管泄露分析

    在我的分析之旅中,遇到過很多程序的故障和殺毒軟件扯上了關(guān)系,有殺毒軟件導(dǎo)致的程序卡死,有殺毒軟件導(dǎo)致的程序崩潰,這一篇又出現(xiàn)了一個殺毒軟件導(dǎo)致的程序非托管內(nèi)存泄露,真的是分析多了什么鬼都能撞上。 前幾天有位朋友找到過,我他們的程序內(nèi)存在慢慢的泄

    2024年02月03日
    瀏覽(25)
  • 記一次 .NET某報關(guān)系統(tǒng) 非托管泄露分析

    記一次 .NET某報關(guān)系統(tǒng) 非托管泄露分析

    前段時間有位朋友找到我,說他的程序內(nèi)存會出現(xiàn)暴漲,讓我看下是怎么事情?而且還告訴我是在 Linux 環(huán)境下,說實話在Linux上分析.NET程序難度會很大,難度大的原因在于Linux上的各種開源工具主要是針對 C/C++, 和 .NET 一毛錢關(guān)系都沒有,說到底微軟在 Linux 上的調(diào)試領(lǐng)域支持

    2024年02月14日
    瀏覽(21)
  • 記一次 .NET 某醫(yī)院預(yù)約平臺 非托管泄露分析

    記一次 .NET 某醫(yī)院預(yù)約平臺 非托管泄露分析

    前幾天有位朋友找到我,說他的程序有內(nèi)存泄露,讓我?guī)兔ε挪橐幌拢貓D如下: 說實話看到 32bit, 1.5G 這些之后,職業(yè)敏感告訴我,他這個可能是虛擬地址緊張所致,不管怎么說,有了 Dump 就可以上馬分析。 要看是不是虛擬地址緊張,可以用 !address -summary 觀察下內(nèi)

    2024年02月12日
    瀏覽(21)
  • 記一次 .NET某新能源MES系統(tǒng) 非托管泄露

    記一次 .NET某新能源MES系統(tǒng) 非托管泄露

    前些天有位朋友找到我,說他們的程序有內(nèi)存泄露,跟著我的錯題集也沒找出是什么原因,剛好手頭上有一個 7G+ 的 dump,讓我?guī)兔聪率窃趺椿厥?,既然找到我了那就給他看看吧,不過他的微信頭像有點像 二道販子 ,不管到我這里是不是 三道 ,該分析的還得要分析呀。??

    2024年02月08日
    瀏覽(19)
  • 用 perfcollect 洞察 Linux 上.NET程序 CPU爆高

    用 perfcollect 洞察 Linux 上.NET程序 CPU爆高

    如果要分析 Linux上的 .NET程序 CPU 爆高,按以往的個性我肯定是抓個 dump 下來做事后分析,這種分析模式雖然不重但也不輕,還需要一定的底層知識,那有沒有傻瓜式的 CPU 爆高分析方式呢? 相信有很多朋友知道 B站713事件 ,最終就是用 perf 找到了那個讓 cpu 100% 的 lua 函數(shù),截

    2024年02月16日
    瀏覽(13)
  • Net 高級調(diào)試之四:Windbg 動態(tài)調(diào)試

    Net 高級調(diào)試之四:Windbg 動態(tài)調(diào)試

    一、簡介 今天是《Net 高級調(diào)試》的第四篇文章。到今天為止,也有三篇文章了,對 Windbg 也有初步的認識了,當(dāng)然,一個工具流暢、熟練的使用,對于我們調(diào)試 Net 程序是至關(guān)重要的。在前幾篇文章的基礎(chǔ)上,我們這篇文章主要介紹一些和使用 Windbg 有關(guān)的命令和操作。就我

    2024年02月06日
    瀏覽(26)
  • PerfView專題 (第十五篇): 如何洞察 C# 中的慢速方法

    PerfView專題 (第十五篇): 如何洞察 C# 中的慢速方法

    在 dump 分析旅程中,經(jīng)常會遇到很多朋友反饋一類問題,比如: 方法平時都執(zhí)行的特別快,但有時候會特別慢,怎么排查? 我的方法第一次執(zhí)行特別慢,能看到慢在哪里嗎? 相信有朋友肯定說,加些日志不就好了,大方向肯定是沒問題的,但加日志的顆粒度會比較粗而且侵

    2024年02月16日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包