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

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

這篇具有很好參考價值的文章主要介紹了記一次 .NET 某醫(yī)院預(yù)約平臺 非托管泄露分析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一:背景

1. 講故事

前幾天有位朋友找到我,說他的程序有內(nèi)存泄露,讓我?guī)兔ε挪橐幌拢貓D如下:

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

說實話看到 32bit, 1.5G 這些關(guān)鍵詞之后,職業(yè)敏感告訴我,他這個可能是虛擬地址緊張所致,不管怎么說,有了 Dump 就可以上馬分析。

二:WinDbg分析

1. 虛擬地址緊張所致嗎

要看是不是虛擬地址緊張,可以用 !address -summary 觀察下內(nèi)存段統(tǒng)計信息,截圖如下:

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

我去,用 WinDbg Preview 盡然分析不了,在加載 ntdll 的過程中死掉了,如果你是我們調(diào)試訓(xùn)練營的朋友,應(yīng)該會深深的有體會,我們分析的第一個dump就存在這個情況,這個加載不了其實就預(yù)示著一種非托管泄露,這里暫不劇透。

WinDbg Preview 分析不了怎么辦呢?可以用 Windbg 的其他版本哈,比如 Windbg10, WinDbg6 等等,這里就采用 WinDbg10 X86 版本打開吧。


0:000> !address -summary

--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
Free                                    179          8cbb1000 (   2.199 GB)           54.97%
Heap                                   6598          376f6000 ( 886.961 MB)  48.09%   21.65%
<unknown>                              3091          31954000 ( 793.328 MB)  43.02%   19.37%
Image                                   376           8c0d000 ( 140.051 MB)   7.59%    3.42%
Stack                                    75           1780000 (  23.500 MB)   1.27%    0.57%
Other                                     7             4e000 ( 312.000 kB)   0.02%    0.01%
TEB                                      25             19000 ( 100.000 kB)   0.01%    0.00%
PEB                                       1              1000 (   4.000 kB)   0.00%    0.00%

--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_FREE                                179          8cbb1000 (   2.199 GB)           54.97%
MEM_COMMIT                             9821          6bfad000 (   1.687 GB)  93.68%   42.18%
MEM_RESERVE                             352           7492000 ( 116.570 MB)   6.32%    2.85%

從卦中 MEM_COMMIT%ofTotal= 42.18% 來看,提交內(nèi)存占總的虛擬地址比重還不到一半,這說明我的猜測是錯的,不存在虛擬地址緊張的情況,這里稍微提醒一下的是,這里不存在虛擬地址緊張是因為它開的是 Any CPU 模式,默認能吃到 4G 內(nèi)存。

不管怎么說,現(xiàn)在被當頭一棒,既然這條路走不通,那會是什么情況導(dǎo)致的呢?一般來說這個內(nèi)存量我是不愿意分析的,但既然分析到這里也只能繼續(xù)分析,接下來用 !eeheap -gc 觀察下托管堆內(nèi)存占用情況。


0:000> !eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x777c0434
generation 1 starts at 0x77781000
generation 2 starts at 0x01861000
ephemeral segment allocation context: none
 segment     begin  allocated      size
01860000  01861000  0285ffdc  0xffefdc(16773084)
...
77780000  77781000  77aa25c0  0x3215c0(3282368)
Large object heap starts at 0x02861000
 segment     begin  allocated      size
02860000  02861000  031e5cc0  0x984cc0(9981120)
Total Size:              Size: 0x1f7e47e4 (528369636) bytes.
------------------------------
GC Heap Size:    Size: 0x1f7e47e4 (528369636) bytes.

從卦中看當前托管堆也才 528M 和 提交內(nèi)存 1.6G 相距甚遠,所以這個 dump 大概率是存在非托管內(nèi)存泄露,其實 !address -summary 中的 Heap 也能佐證,說到底就是 ntheap 泄露。

2. ntheap 怎么啦

深挖 ntheap 我就不挖了,省的誤入歧途,文章開頭我說過 ntdll 無法加載的現(xiàn)象預(yù)示著一種非托管泄露,對 ,就是 GC 的加載堆泄露,加載堆是 CLR 用來映射 C# 程序集,模塊,類型,方法等用途的一塊私有內(nèi)存,那怎么去洞察它呢?可以使用 !eeheap -loader 命令洞察。


0:000> !eeheap -loader
Loader Heap:
--------------------------------------
...
Module 05829f78: Size: 0x0 (0) bytes.
Module 0582a8f8: Size: 0x0 (0) bytes.
Module 0582b278: Size: 0x0 (0) bytes.
Module 0582bbf8: Size: 0x0 (0) bytes.
Module 0582c578: Size: 0x0 (0) bytes.
Module 0582cef8: Size: 0x0 (0) bytes.
Module 0582d878: Size: 0x0 (0) bytes.
...
Module 362ea420: Size: 0x0 (0) bytes.
Total size:      Size: 0x0 (0) bytes.
--------------------------------------
Total LoaderHeap size:   Size: 0x7e7e000 (132636672) bytes total, 0x28000 (163840) bytes wasted.
=======================================

雖然加載堆只統(tǒng)計到了 132M,但其中的 module 高達 2.3w 個,其實這里會有一些相關(guān)內(nèi)存是加載堆之外無法統(tǒng)計到的,一般正常的程序不可能有這么多的module,所以這就是我們接下來突破的點,那怎么突破呢?最好的辦法就是觀察下這個 module 中到底有什么 type,使用 !dumpmodule 命令即可。


0:000> !dumpmodule -mt 0582d878
Name:       Unknown Module
Attributes: Reflection 
Assembly:   0c229d38
LoaderHeap:              00000000
TypeDefToMethodTableMap: 050676e4
TypeRefToMethodTableMap: 050676f8
MethodDefToDescMap:      0506770c
FieldDefToDescMap:       05067734
MemberRefToDescMap:      00000000
FileReferencesMap:       05067784
AssemblyReferencesMap:   05067798

Types defined in this module

      MT  TypeDef Name
------------------------------------------------------------------------------
0582dcb0 0x02000002 
0582df90 0x02000003 
0582e018 0x02000004 
0582e0b8 0x02000005 
0582e194 0x02000006 

Types referenced in this module

      MT    TypeRef Name
------------------------------------------------------------------------------

從模塊中并沒有看到類型的文字描述,那怎么辦呢,我們隨便抽一個 mt 看下這個 mt 下有什么方法,使用 !dumpmt 命令即可。


0:000> !dumpmt -md 0582dcb0
EEClass:         05068980
Module:          0582d878
Name:            
mdToken:         02000002
File:            Unknown Module
BaseSize:        0x44
ComponentSize:   0x0
Slots in VTable: 8
Number of IFaces in IFaceMap: 0
--------------------------------------
MethodDesc Table
   Entry MethodDe    JIT Name
739819c8 735e61fc PreJIT System.Object.ToString()
73987850 735e6204 PreJIT System.Object.Equals(System.Object)
7398bd80 735e6224 PreJIT System.Object.GetHashCode()
738ddbe8 735e6238 PreJIT System.Object.Finalize()
0583b529 0582dc8c   NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterCallBack.InitCallbacks()
0583b52d 0582dc94   NONE Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterCallBack..ctor()
0583c7d0 0582dc74    JIT Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterCallBack.Write3_root(System.Object)
0583c868 0582dc80    JIT Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterCallBack.Write2_CallBack(System.String, System.String, xxx.Models.xxxBack, Boolean, Boolean)

看到卦中的這些信息,我相信有很多朋友知道是怎么回事了,對,就是 Serialization 泄露,那它序列化什么類型呢 ? 從卦中看就是 xxx.Models.xxxBack 類,即 xmlSerializer.Serialize(xxx.Models.xxxBack) 的相關(guān)邏輯,接下來就需要逆向看下到底是哪里寫的,結(jié)果發(fā)現(xiàn)是他的底層庫封裝的,有些方法有問題,有些沒問題,真的是無語哈。


    //有問題的方法
    public static string Serialize(object o, Encoding encoding, string rootName)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(o.GetType(), new XmlRootAttribute(rootName));
        ...
        xmlSerializer.Serialize(memoryStream, o, xmlSerializerNamespaces);
        return encoding.GetString(memoryStream.ToArray());
    }

    //正確的方法
    public static string Serialize(object Obj, Encoding encoding)
    {
        ...
        using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings))
        {
            XmlSerializerNamespaces xmlSerializerNamespaces = new XmlSerializerNamespaces();
            xmlSerializerNamespaces.Add("", "");
            new XmlSerializer(Obj.GetType()).Serialize(xmlWriter, Obj, xmlSerializerNamespaces);
        }
        return encoding.GetString(memoryStream.ToArray());
    }

這是一個老生常談的問題,如果你用 new XmlSerializer(o.GetType(), new XmlRootAttribute(rootName)); 模式的話,一定要緩存起來,否則就會泄露,只能說是微軟造的一個大坑吧,多少人都踩上去了。

三:總結(jié)

在我分析的真實dump案例中,見過 Castle ProxyGenerator 的泄露,也見過 CodeAnalysis.CSharp.Scripting 的泄露,還真沒見過 XmlSerializer 的泄露,算是完美的補充了我的案例庫!文章來源地址http://www.zghlxwxcb.cn/news/detail-521602.html

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

到了這里,關(guān)于記一次 .NET 某醫(yī)院預(yù)約平臺 非托管泄露分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 記一次 .NET 某醫(yī)院門診軟件 卡死分析

    記一次 .NET 某醫(yī)院門診軟件 卡死分析

    前幾天有位朋友找到我,說他們的軟件在客戶那邊卡死了,讓我?guī)兔聪率窃趺椿厥??我就讓朋友在程序卡死的時候通過 任務(wù)管理器 抓一個 dump 下來,雖然默認抓的是 wow64 ,不過用 soswow64.dll 轉(zhuǎn)還是可以的,參考命令如下: 接下來就可以分析了哈。 首先用 !t 簡單看一下主

    2024年02月04日
    瀏覽(19)
  • 記一次 .NET 某企業(yè)采購平臺 崩潰分析

    記一次 .NET 某企業(yè)采購平臺 崩潰分析

    前段時間有個朋友找到我,說他們的程序有偶發(fā)崩潰的情況,讓我?guī)兔聪略趺椿厥?,針對這種 crash 的程序,用 AEDebug 的方式抓取一個便知,有了 dump 之后接下來就可以分析了。 既然是程序的崩潰,我們可以像看藍屏一下看dump文件,使用 !analyze -v 命令即可。 從上面的信息

    2024年02月11日
    瀏覽(24)
  • 記一次 .NET某防偽驗證系統(tǒng) 崩潰分析

    記一次 .NET某防偽驗證系統(tǒng) 崩潰分析

    昨晚給訓(xùn)練營里面的一位朋友分析了一個程序崩潰的故障,因為看小伙子昨天在群里問了一天也沒搞定,干脆自己親自上陣吧,抓取的dump也是我極力推薦的用 procdump 注冊 AEDebug 的方式,省去了很多溝通成本。 windbg有一個非常強大的點就是當你雙擊打開后,會自動幫你切換到

    2024年03月28日
    瀏覽(26)
  • 記一次 .NET 某企業(yè)內(nèi)部系統(tǒng) 崩潰分析

    記一次 .NET 某企業(yè)內(nèi)部系統(tǒng) 崩潰分析

    前些天有位朋友找到我,說他的程序跑著跑著就崩潰了,讓我看下怎么回事,其實沒怎么回事,抓它的 crash dump 就好,具體怎么抓也是被問到的一個高頻問題,這里再補一下鏈接: [.NET程序崩潰了怎么抓 Dump ? 我總結(jié)了三種方案] https://www.cnblogs.com/huangxincheng/p/14811953.html ,采用

    2024年02月10日
    瀏覽(22)
  • 記一次 .NET 某餐飲小程序 內(nèi)存暴漲分析

    記一次 .NET 某餐飲小程序 內(nèi)存暴漲分析

    前些天有位朋友找到我,說他的程序內(nèi)存異常高,用 vs診斷工具 加載時間又太久,讓我?guī)兔匆幌碌降渍厥?,截圖如下: 確實,如果dump文件超過 10G 之后,市面上那些可視化工具分析起來會讓你崩潰的,除了時間久之外這些工具大多也不是用懶加載的方式,比如 dotmemory

    2024年02月08日
    瀏覽(15)
  • 記一次 .NET 某券商論壇系統(tǒng) 卡死分析

    記一次 .NET 某券商論壇系統(tǒng) 卡死分析

    前幾個月有位朋友找到我,說他們的的web程序沒有響應(yīng)了,而且監(jiān)控發(fā)現(xiàn)線程數(shù)特別高,內(nèi)存也特別大,讓我?guī)兔匆幌略趺椿厥拢F(xiàn)在回過頭來幾經(jīng)波折,回味價值太濃了。 這個程序內(nèi)存高,線程高,無響應(yīng),尼瑪是一個復(fù)合態(tài)問題,那怎么入手呢?按經(jīng)驗推測,大概率是

    2024年02月05日
    瀏覽(32)
  • 記一次 .NET 某電力系統(tǒng) 內(nèi)存暴漲分析

    記一次 .NET 某電力系統(tǒng) 內(nèi)存暴漲分析

    前些天有位朋友找到我,說他生產(chǎn)上的程序有內(nèi)存暴漲情況,讓我?guī)兔聪略趺椿厥?,最簡單粗暴的方法就是讓朋友在?nèi)存暴漲的時候抓一個dump下來,看一看大概就知道咋回事了。 這個問題說的再多也不為過,一定要看清楚這個程序是如何個性化發(fā)展的,可以使用 !address

    2024年02月08日
    瀏覽(19)
  • 記一次 .NET 某外貿(mào)ERP 內(nèi)存暴漲分析

    記一次 .NET 某外貿(mào)ERP 內(nèi)存暴漲分析

    上周有位朋友找到我,說他的 API 被多次調(diào)用后出現(xiàn)了內(nèi)存暴漲,讓我?guī)兔聪率窃趺椿厥??看樣子是有些擔心,但也不是特別擔心,那既然找到我,就給他分析一下吧。 這也是我一直在訓(xùn)練營灌輸?shù)睦砟?,一定要知道是哪一邊的暴漲,否則很可能就南轅北轍了,使用 !addr

    2023年04月23日
    瀏覽(27)
  • 記一次 .NET某股票交易軟件 靈異崩潰分析

    記一次 .NET某股票交易軟件 靈異崩潰分析

    在dump分析的旅程中也會碰到一些讓我無法解釋的靈異現(xiàn)象,追過這個系列的朋友應(yīng)該知道,上一篇我聊過 宇宙射線 導(dǎo)致的程序崩潰,后來我又發(fā)現(xiàn)了一例,而這一例恰恰是高鐵的 列控連鎖一體化 程序,所以更加讓我確定這是由于 電離輻射 干擾了計算機的 數(shù)字信號 導(dǎo)致程

    2024年02月04日
    瀏覽(24)
  • 記一次 .NET某列控連鎖系統(tǒng) 崩潰分析

    記一次 .NET某列控連鎖系統(tǒng) 崩潰分析

    過年喝了不少酒,腦子不靈光了,停了將近一個月沒寫博客,今天就當新年開工寫一篇吧。 去年年初有位朋友找到我,說他們的系統(tǒng)會偶發(fā)性崩潰,在網(wǎng)上也發(fā)了不少帖子求助,沒找到自己滿意的答案,讓我看看有沒有什么線索,看樣子這是一個牛皮蘚的問題,既然對方有了

    2024年02月21日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包