精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

記一次 .NET 某醫院預約平臺 內存泄露分析

開發 架構
在我分析的真實dump案例中,見過 Castle ProxyGenerator? 的泄露,也見過 CodeAnalysis.CSharp.Scripting? 的泄露,還真沒見過 XmlSerializer 的泄露,算是完美的補充了我的案例庫!

一:背景

1. 講故事

前幾天有位朋友找到我,說他的程序有內存泄露,讓我幫忙排查一下,截圖如下:

圖片圖片

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

二:WinDbg分析

1. 虛擬地址緊張所致嗎

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

圖片圖片

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

用 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% 來看,提交內存占總的虛擬地址比重還不到一半,這說明我的猜測是錯的,不存在虛擬地址緊張的情況,這里稍微提醒一下的是,這里不存在虛擬地址緊張是因為它開的是 Any CPU 模式,默認能吃到 4G 內存。

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

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 和 提交內存 1.6G 相距甚遠,所以這個 dump 大概率是存在非托管內存泄露,其實 !address -summary 中的 Heap 也能佐證,說到底就是 ntheap 泄露。

2. ntheap 怎么啦

深挖 ntheap 我就不挖了,省的誤入歧途,文章開頭我說過 ntdll 無法加載的現象預示著一種非托管泄露,對 ,就是 GC 的加載堆泄露,加載堆是 CLR 用來映射 C# 程序集,模塊,類型,方法等用途的一塊私有內存,那怎么去洞察它呢?可以使用 !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.
=======================================

雖然加載堆只統計到了 132M,但其中的 module 高達 2.3w 個,其實這里會有一些相關內存是加載堆之外無法統計到的,一般正常的程序不可能有這么多的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) 的相關邏輯,接下來就需要逆向看下到底是哪里寫的,結果發現是他的底層庫封裝的,有些方法有問題,有些沒問題,真的是無語哈。

//有問題的方法
    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)); 模式的話,一定要緩存起來,否則就會泄露,只能說是微軟造的一個大坑吧,多少人都踩上去了。

三:總結

在我分析的真實dump案例中,見過 Castle ProxyGenerator 的泄露,也見過 CodeAnalysis.CSharp.Scripting 的泄露,還真沒見過 XmlSerializer 的泄露,算是完美的補充了我的案例庫!

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

2023-05-15 11:15:50

.NET門診語句

2023-10-07 13:28:53

.NET軟件賬本

2023-06-26 00:12:46

2021-11-02 07:54:41

內存.NET 系統

2023-09-26 01:11:58

MES非托管泄露

2022-10-24 07:48:37

.NETCPUGC

2024-12-27 13:31:18

.NETdump調試

2024-03-28 12:56:36

2023-04-06 10:52:18

2021-10-09 10:24:08

NET爬蟲內存

2024-05-20 09:39:02

.NETurl線程池

2023-09-27 07:23:10

.NET監控軟件

2023-03-26 20:24:50

ERP網站系統

2024-07-12 11:20:34

.NET崩潰視覺程序

2024-03-26 00:44:53

.NETCIM系統

2022-10-13 18:40:05

.NETOA后端

2021-10-27 07:30:32

.NETCPU論壇

2024-05-31 12:56:06

.NET代碼方法

2024-07-01 13:00:24

.NET網絡邊緣計算

2022-10-25 14:17:01

.NET代碼程序
點贊
收藏

51CTO技術棧公眾號

欧美成人日韩| 大地资源网3页在线观看| 国产日韩1区| 亚洲一二在线观看| 两性午夜免费视频| 2020国产在线| 国产午夜亚洲精品理论片色戒| 国产精品美女主播| 久久久香蕉视频| 久久最新网址| 日韩欧美成人激情| 国产精品亚洲二区在线观看| 黄色动漫在线| 久久久亚洲精品石原莉奈| 成人www视频在线观看| 日本天堂在线视频| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 国产精品50p| 日本不卡三区| 91蝌蚪国产九色| 亚洲一区美女视频在线观看免费| 日本一级一片免费视频| 先锋资源久久| 国产亚洲精品美女久久久| 妖精视频在线观看| 黄色精品视频| 狠狠干狠狠久久| 免费观看国产视频在线| 狠狠v欧美ⅴ日韩v亚洲v大胸| 国产一区二区视频在线| 日韩美女视频中文字幕| 久久久精品91| 国产精品99久久精品| 亚洲国产成人在线播放| 日本高清免费在线视频| 91tv亚洲精品香蕉国产一区| 欧美日韩国产区| 99久热在线精品视频| 91精品国产综合久久久久久豆腐| 91亚洲精品久久久蜜桃| 97在线电影| 国产免费黄色片| 青青草国产成人av片免费| …久久精品99久久香蕉国产| 9999热视频| 日韩久久精品| 中文字幕精品一区久久久久 | 99久久精品国产一区二区成人| 日韩精品一级二级| 欧美综合一区第一页| 国产成人啪精品午夜在线观看| 亚洲国产日韩欧美在线| 色婷婷**av毛片一区| 欧美特级黄色录像| 精品成av人一区二区三区| 亚洲欧美福利视频| 舐め犯し波多野结衣在线观看| 色综合综合色| 亚洲香蕉成视频在线观看| 我和岳m愉情xxxⅹ视频| 国产欧美日韩影院| 一区二区三区视频免费| 九九九视频在线观看| 精品国产乱码久久久| 国产亚洲欧洲黄色| 少妇视频一区二区| 一区二区日韩欧美| 国产+人+亚洲| aaa人片在线| 美女视频一区免费观看| 热re99久久精品国产66热| 国产女主播喷水视频在线观看| 丝袜美腿高跟呻吟高潮一区| 国产极品jizzhd欧美| 中文字幕在线观看视频免费| 日韩电影在线一区二区三区| 成人久久18免费网站图片| 国产激情视频在线播放 | 成人做爰66片免费看网站| 亚洲国产精品二区| 91网上在线视频| 日韩福利在线| 巨大荫蒂视频欧美另类大| 一区二区三区不卡在线观看| 无码专区aaaaaa免费视频| 欧美xxx视频| 欧美麻豆精品久久久久久| 天天干天天曰天天操| 狠狠久久伊人| 综合激情国产一区| 黄色在线观看免费| 巨乳诱惑日韩免费av| 国产欧美精品一区二区三区-老狼| 国产视频第一页| 9久草视频在线视频精品| 色乱码一区二区三在线看| 午夜激情视频在线观看| 亚洲成人手机在线| 91小视频网站| 欧美18xxxx| 中文字幕av一区二区| 国产一级免费av| 视频一区欧美精品| 99re6热在线精品视频播放速度| 日韩av视屏| 亚洲人精品午夜| 日本一本二本在线观看| 国产精品久久久久久久久久辛辛 | 韩国精品一区二区| 国产欧美综合精品一区二区| 日本在线播放| 91久久精品国产91性色tv| 中文字幕欧美视频| 欧美一二区在线观看| 九九热精品视频在线播放| 波多野结衣电车| 成人精品亚洲人成在线| 一本一本a久久| 美女18一级毛片一品久道久久综合| 欧美一区二区三区男人的天堂 | 综合av第一页| 欧美精品第三页| 国内精品国产成人国产三级粉色 | 亚洲一二三在线观看| 美女精品在线| 精品一区国产| av成人福利| 日韩免费电影网站| 亚洲AV成人无码网站天堂久久| 亚洲免费婷婷| 国内精品视频在线播放| 欧美男男video| 51精品秘密在线观看| 黄色一级片一级片| 日本女优在线视频一区二区| 久久国产精品免费一区| 超碰97国产精品人人cao| 欧美一区二区三区播放老司机| 一区二区三区在线观看免费视频| 国产精品一级| 久久草视频在线看| 绿色成人影院| 亚洲国产精品福利| 国产中文字幕免费| 成人性生交大片免费看视频在线| 看一级黄色录像| 精品国产亚洲一区二区三区在线| 精品国内自产拍在线观看| 一级特黄aaa大片| 中文字幕在线一区二区三区| 无限资源日本好片| av亚洲免费| 国产精品你懂得| 在线观看黄av| 777久久久精品| 日韩欧美123区| 久久草av在线| 国产精品无码乱伦| 国产一区二区三区免费观看在线 | 国产精久久久| 欧美日韩999| 天堂中文在线资源| 欧美视频中文在线看| 久久精品一区二区免费播放 | 黄色小视频在线免费观看| 一本一本久久a久久精品综合麻豆| 毛茸茸多毛bbb毛多视频| 久久久久中文| 国产成人精品免费看在线播放 | 国产精彩视频在线| 99精品在线免费| www.四虎成人| 久久一区二区三区电影| 99porn视频在线| 神马午夜在线视频| 在线精品高清中文字幕| 国产女人爽到高潮a毛片| 亚洲综合免费观看高清完整版在线 | 久久人人爽人人爽人人av| 天堂俺去俺来也www久久婷婷| 国产成人精品av| 久cao在线| 亚洲国产精品久久久久秋霞蜜臀 | 日本欧美韩国一区三区| 欧美xxxx吸乳| 亚洲精品国模| 成人www视频在线观看| 白白色在线观看| 亚洲欧美日韩中文在线制服| 91久久精品无码一区二区| 亚洲一区二区综合| 欧美大波大乳巨大乳| 国产乱码精品一区二区三区av | 日本精品另类| 欧美激情va永久在线播放| 九色视频在线播放| 日韩色视频在线观看| 无码人妻精品一区二区| 一区二区三区免费观看| 人妻少妇无码精品视频区| 国产ts人妖一区二区| 国产裸体免费无遮挡| 欧美日本一区| 亚洲精品在线免费| 菁菁伊人国产精品| 91美女片黄在线观看游戏| 麻豆视频在线看| 欧美插天视频在线播放| 加勒比一区二区三区在线| 日韩欧美的一区| 国产精品露脸视频| 欧美日韩久久久久| 国产大学生自拍| 久久久www免费人成精品| 美女黄色一级视频| 国产一区二区0| 亚洲高清免费在线观看| 美女久久一区| 欧美 日韩 国产在线观看| 中文字幕一区二区av| 亚洲精品乱码久久久久久蜜桃91| 欧美日韩一区二区三区不卡视频| 亚洲一区二区日本| 欧美天堂一区二区| 日韩美女中文字幕| 国产精品一区二区日韩| 精品自在线视频| 成人看片免费| 久久久av网站| 91激情在线| 一区二区三区视频观看| 欧美成人片在线| 国产视频亚洲精品| 亚洲 小说区 图片区 都市| 精品久久五月天| 亚洲第一天堂影院| 日韩欧美一二三| 99久久亚洲精品日本无码| 欧美日韩一本到| 在线免费观看av片| 欧美撒尿777hd撒尿| 成人免费视频国产免费| 色综合久久综合网欧美综合网| 中文字幕日韩一级| 亚洲va欧美va人人爽午夜| 久久久精品视频免费| 亚洲福利一二三区| 日韩精品一区二区三| 亚洲1区2区3区4区| 少妇一级淫片免费放中国| 欧美日韩中文字幕综合视频| 国产无遮挡又黄又爽又色| 亚洲成人自拍网| 中文字幕免费在线观看视频| 欧美性色xo影院| 精品久久久久久久久久久国产字幕 | 精品一区二区三区视频在线播放 | 性欧美极品xxxx欧美一区二区| 首页国产欧美久久| 日本黄大片一区二区三区| 精品一区二区久久久| 九九热视频免费| 国产成人欧美日韩在线电影| 美女扒开腿免费视频| 91网页版在线| 成人小视频免费看| 亚洲女同一区二区| 国产真实的和子乱拍在线观看| 欧美日韩在线观看视频| 中文天堂在线资源| 91精品蜜臀在线一区尤物| 亚洲成人777777| 亚洲精品黄网在线观看| 国产免费av在线| 久久视频在线直播| аⅴ资源天堂资源库在线| 欧美一区二区三区免费观看| 91另类视频| 成人xxxxx色| 国产欧美日韩| 国产精品久久久影院| 99精品国产在热久久| 欧美成人黄色网址| 国产传媒一区在线| 美女久久久久久久久久| 国产精品灌醉下药二区| 动漫精品一区一码二码三码四码| 日本韩国精品在线| va婷婷在线免费观看| 国产视频一区在线| 黄黄的网站在线观看| 1769国产精品| 国产精品一区免费在线 | 国产黄色小视频在线| 久久久久久网址| 成人激情视屏| 国产综合 伊人色| 91日韩在线| 国产黄色特级片| 国v精品久久久网| 少妇愉情理伦三级| 精品久久久久久久久久| 亚洲天堂中文网| 亚洲精品视频免费在线观看| 超碰在线免费播放| 国产成人久久久| 国产日韩三级| 久久久99精品视频| 日本午夜精品久久久久| 日韩av电影一区| 九九久久久久99精品| 久草在线资源站资源站| 国产精品人成电影在线观看| 精品综合久久88少妇激情| 亚洲一区二区三区涩| 亚洲一区网站| wwwxxx色| 综合激情成人伊人| 又污又黄的网站| 亚洲男子天堂网| 美女高潮视频在线看| 91久久爱成人| 图片区亚洲欧美小说区| 国产激情在线观看视频| 91首页免费视频| 精品一区免费观看| 日韩三级.com| 国产一二区在线观看| 国产精品视频久久久| 九九热爱视频精品视频| 一区二区传媒有限公司| 国产成人av一区| 欧美成欧美va| 在线播放欧美女士性生活| 在线国产91| 成人免费午夜电影| 日韩久久综合| 久久久久久久久久一区| 国产精品久久久久久久岛一牛影视| 国产精品午夜影院| 日韩电影中文字幕在线观看| mm视频在线视频| 欧美贵妇videos办公室| 色男人天堂av| 国产高清视频一区二区| 日本一区二区精品| 日韩和的一区二区| 久久成人激情视频| 欧美三级中文字| 日本免费中文字幕在线| 成人免费直播live| 一区二区不卡| 在线观看亚洲免费视频| 婷婷国产在线综合| 久久经典视频| 国产精品视频在线播放| 日韩dvd碟片| 图片区乱熟图片区亚洲| 亚洲另类春色国产| 欧美一区二区三区黄片| 77777少妇光屁股久久一区| 亚洲精品亚洲人成在线观看| 国产淫片av片久久久久久| 久久精品人人做人人综合| 亚洲影视一区二区| 粗暴蹂躏中文一区二区三区| 香蕉成人app| 国产伦精品一区二区三区四区视频_| 91免费国产在线观看| 波多野结衣视频观看| 色多多国产成人永久免费网站| www一区二区三区| 大西瓜av在线| 久久精品日韩一区二区三区| 97视频免费在线| 久久久久久免费精品| 欧美日韩播放| a级大片免费看| 欧美性猛xxx| 欧美日韩xx| 欧美日韩亚洲天堂| 亚洲成熟女性毛茸茸| 2021国产精品视频| 日韩伦理视频| wwwxx日本| 欧美亚洲国产一区二区三区| 中文在线手机av| 免费成人在线观看av| 九九九久久久精品| 国产毛片aaa| 久久精品久久久久电影| 国产精品网址| 久久久精品高清| 欧美视频在线观看 亚洲欧| 欧洲美女少妇精品| 麻豆91蜜桃| 国产精品主播直播| 无码人妻一区二区三区线| 欧美黑人性猛交| 欧美aaaa视频|