精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲色图第一页| 午夜久久美女| 欧美最新大片在线看| 成人黄色片在线| 欧美日韩大片在线观看| 香蕉视频一区二区三区| 精品视频色一区| 欧美不卡在线播放| 婷婷激情在线| 91在线视频网址| 91亚洲精品久久久久久久久久久久| 妺妺窝人体色www聚色窝仙踪| 精品一区在线| 精品免费日韩av| 亚洲午夜精品一区| 亚洲精品日产| 亚洲成人免费视频| 中文字幕av导航| 国产在线视频资源| 风流少妇一区二区| 91香蕉电影院| 日韩精选在线观看| aⅴ色国产欧美| 九九精品在线观看| 后入内射无码人妻一区| 亚瑟一区二区三区四区| 欧美va亚洲va| 超碰成人在线播放| 视频在线日韩| 色综合久久久久网| 僵尸世界大战2 在线播放| 欧美96在线| 欧美激情在线观看视频免费| 精品无人区一区二区三区| 国内精品国产成人国产三级| 免费一区二区视频| 国产成人精品免费久久久久 | av中文字幕网址| 自拍在线观看| 欧美日韩黄色大片| 成人网站免费观看入口| 丝袜综合欧美| 一区二区三区在线观看国产| 先锋影音男人资源| 老司机免费在线视频| 国产精品免费久久| 天天综合狠狠精品| av片在线免费观看| 国产精品女同一区二区三区| 日韩国产精品一区二区| 久久夜色精品国产噜噜亚洲av| 一区二区影视| 欧美大胆a视频| 国产一区二区视频在线观看免费| 久久国产精品成人免费观看的软件| 亚洲人a成www在线影院| a毛片毛片av永久免费| 欧美爱爱网站| 国产视频丨精品|在线观看| 日本丰满少妇裸体自慰| 天堂一区二区三区四区| 亚洲人成网站在线播| 国产美女免费无遮挡| 久久99国产精一区二区三区| 亚洲人成电影网站色…| av女人的天堂| 欧美oldwomenvideos| 日韩中文在线观看| 久久久久无码国产精品| 亚洲第一伊人| 国产99在线|中文| 中文字幕+乱码+中文字幕明步| 三级欧美韩日大片在线看| 日本乱人伦a精品| 一级久久久久久| 国产最新精品精品你懂的| 亚洲伊人久久综合| 色网站免费观看| 久久久久国产一区二区三区四区| 日韩成人在线资源| av免费在线观| 午夜成人免费视频| 国产 porn| 欧美另类中文字幕| 日韩国产中文字幕| 男人av资源站| 99国产精品私拍| 国产精品日韩欧美| 韩国av在线免费观看| 99国产欧美另类久久久精品| 亚洲精品在线免费看| 亚洲h片在线看| 疯狂做受xxxx欧美肥白少妇| 色噜噜狠狠一区二区| 成人av激情人伦小说| 亚洲欧美制服综合另类| 青花影视在线观看免费高清| 一区在线免费| 国产精品一区专区欧美日韩| 国产91免费看| 国产精品色哟哟| 欧美精品久久久久久久自慰| 成人精品三级| 亚洲精品美女在线观看| 日本一二三区在线观看| 午夜亚洲性色视频| 亚洲自拍高清视频网站| 黄色在线播放| 亚洲风情在线资源站| 91精品无人成人www| 精品国产乱子伦一区二区| 久久精品亚洲一区| 久久99国产综合精品免费| 国产老肥熟一区二区三区| 欧洲一区二区在线| 182在线播放| 制服丝袜亚洲色图| 精品无人区无码乱码毛片国产| 国产精品啊啊啊| 91深夜福利视频| 国产资源在线看| 精品国产福利在线| 女人扒开腿免费视频app| 区一区二视频| 国产成人免费av| 五月天激情婷婷| 一区二区在线观看av| 久久黄色片网站| 精品99久久| 亚洲全黄一级网站| 日韩xxxxxxxxx| 高清不卡一区二区在线| 制服丝袜综合日韩欧美| 日本欧美不卡| 亚洲人成在线播放| 欧美性猛交bbbbb精品| 99久久综合狠狠综合久久| 香港三级日本三级a视频| 国产精品18| 美女扒开尿口让男人操亚洲视频网站| 姑娘第5集在线观看免费好剧| 久久综合狠狠综合久久激情 | 久久视频精品在线观看| 亚洲欧美久久久| 精品日韩美女| 国产美女高潮在线观看| 亚洲第一福利在线观看| 久久久久久久九九九九| 国产成人在线观看| 久久久99精品视频| jizzjizzjizz欧美| 欧美激情视频在线免费观看 欧美视频免费一| 一本一道精品欧美中文字幕| 亚洲国产精品激情在线观看| 久久国产精品国产精品| 日韩在线观看| 91国产丝袜在线放| 免费网站在线观看人| 亚洲第一免费网站| 好吊操这里只有精品| 92精品国产成人观看免费| www.射射射| 国产欧美久久一区二区三区| 国产成人一区二区在线| 91高清在线| 日韩欧美成人一区二区| 一区二区三区免费高清视频| www.99精品| 国产免费视频传媒| 午夜久久免费观看| 国产精品免费一区二区三区观看| 国产精品xx| 亚洲欧美日韩综合| 一区二区三区www污污污网站| 亚洲精品一二三四区| 中文字幕制服丝袜| 国产欧美日韩一区二区三区在线| 欧美日产一区二区三区在线观看| 林ゆな中文字幕一区二区| 欧美人与性动交| 性xxxx视频| 91福利国产精品| 精品少妇一区二区三区密爱| 国产麻豆精品theporn| 免费cad大片在线观看| 粉嫩的18在线观看极品精品| 2018中文字幕一区二区三区| 国产人成在线视频| 日韩免费性生活视频播放| 国产又大又黄视频| 国产精品第一页第二页第三页| 九色91porny| 久久久亚洲人| a级网站在线观看| 一区二区三区四区在线看| 成人女保姆的销魂服务| а√天堂中文在线资源8| 中文字幕在线观看日韩| 亚洲精品喷潮一区二区三区| 欧美一a一片一级一片| 久久视频免费看| 亚洲国产经典视频| 稀缺小u女呦精品呦| 美女mm1313爽爽久久久蜜臀| 国产av国片精品| 香蕉国产精品| 欧美亚洲免费在线| av成人男女| 亚洲xxxxx性| 亚洲天堂1区| 77777少妇光屁股久久一区| 91视频在线观看| 日韩av最新在线| 精品国自产在线观看| 欧美性猛片aaaaaaa做受| 日本网站在线播放| 亚洲精品成人少妇| 国产精品视频一区二区在线观看| 91丨九色porny丨蝌蚪| 色诱av手机版| 激情综合五月婷婷| 欧美三级理论片| 久久精品导航| 国产中文字幕在线免费观看| 在线观看日韩| 中文字幕人成一区| 日韩欧美视频在线播放| 欧美亚洲免费高清在线观看| 日韩av不卡一区| 国产精品免费观看高清| 日本一区二区三区视频在线看| 国产精品一区二区三区毛片淫片| 亚洲人免费短视频| 日本中文字幕久久看| 不卡专区在线| 韩国美女主播一区| 91九色国产在线播放| 欧美大片在线看| 蜜桃传媒在线观看免费进入| 欧美大尺度在线观看| gogo在线高清视频| 欧美精品一区二区免费| 色呦呦在线看| 欧美激情视频在线观看| 麻豆蜜桃在线| 高清一区二区三区四区五区| 欧美野外wwwxxx| 久久久噜噜噜久久久| 国产美女情趣调教h一区二区| 欧美二区乱c黑人| sqte在线播放| 欧美夜福利tv在线| 大胆人体一区二区| 日韩av手机在线观看| 国产一区二区主播在线| 国产精品美女主播| 亚洲老司机网| 99re视频| 欧美毛片免费观看| 欧美日韩一区综合| 日本高清免费电影一区| 亚洲精品一区二区三区蜜桃久| 日韩欧美精品一区| 91国在线高清视频| 99热免费精品在线观看| heyzo国产| 蜜桃av一区二区| 无码人妻少妇色欲av一区二区| 国产成人免费在线视频| 亚洲激情 欧美| 久久久国产一区二区三区四区小说 | 久久亚洲AV无码| 精品久久久久久久久久久久| 日韩精品成人免费观看视频| 精品污污网站免费看| 成 人片 黄 色 大 片| 日韩大片免费观看视频播放 | 欧美乱人伦中文字幕在线| 精精国产xxxx视频在线中文版 | 六月丁香激情网| 爽好多水快深点欧美视频| 日韩av片专区| 99久久精品免费看国产免费软件| 美女被到爽高潮视频| 自拍偷拍亚洲激情| 国产污污视频在线观看| 欧美日韩一区精品| 三级网站免费观看| 日韩亚洲一区二区| 中文字幕乱码中文乱码51精品| 国产精自产拍久久久久久蜜| 99久热这里只有精品视频免费观看| 蜜桃网站成人| 欧美精品入口| 欧美日韩在线免费播放| 成人一区在线观看| 久久国产亚洲精品无码| 久久99国产精品免费| 国产精品成人无码专区| 国产精品麻豆久久久| 日韩网红少妇无码视频香港| 欧美日韩在线观看一区二区 | 夜夜嗨av色综合久久久综合网| 调教一区二区| 国产精品揄拍500视频| 欧美美女在线直播| 日韩视频一二三| 日韩精品每日更新| 日本黄色免费观看| 亚洲美女视频在线观看| 啪啪小视频网站| 亚洲娇小xxxx欧美娇小| 在线āv视频| 国产精品免费福利| 在线亚洲a色| 日韩精品视频在线观看视频| 精品无人区卡一卡二卡三乱码免费卡| 国产中文字幕一区二区| 一级做a爱片久久| 中文字幕免费播放| 亚洲人成人99网站| av福利在线导航| 动漫一区二区在线| 欧美成人高清| 天天久久综合网| 国产精品久久久久久妇女6080 | 男人的天堂亚洲| 成年女人免费视频| 一区二区在线观看免费视频播放| 91福利免费视频| 中文字幕亚洲色图| 99re久久| 亚洲国产另类久久久精品极度| 亚洲综合另类| 爱爱免费小视频| 狠狠综合久久av一区二区小说| 欧美自拍第一页| 97在线观看免费高清| 国产成人免费av一区二区午夜| 亚洲欧美久久234| 青青青伊人色综合久久| 精品亚洲aⅴ无码一区二区三区| 欧美特级www| 男女网站在线观看| 国产精品成人在线| 欧美久久精品一级c片| 欧美亚洲日本在线观看| 国产欧美久久久精品影院| 日本欧美www| 日韩在线视频中文字幕| 国产精品一区二区精品| 久久观看最新视频| 成人国产精品免费观看动漫| 国产污视频在线观看| 亚洲精品福利在线观看| 成人福利视频| 亚洲一区综合| 国产一区高清在线| 久久精品视频国产| 亚洲激情自拍图| 国产一区二区主播在线| 宅男在线精品国产免费观看| 国产精品香蕉一区二区三区| 精品无码久久久久| 国产丝袜视频一区| 国产精品麻豆成人av电影艾秋| 亚洲一区二区三区免费看| 国产在线精品一区二区夜色| 国产小视频在线观看免费| 亚洲男女自偷自拍图片另类| 亚洲成人看片| 大地资源网在线观看免费官网| 成人美女视频在线看| www.com亚洲| 久久高清视频免费| 丝袜av一区| 99re6在线观看| 亚洲成av人影院| www.成人.com| 成人av电影免费| 日韩国产欧美在线视频| 欧美第一页在线观看| 亚洲精品天天看| 精品三级久久久| 免费在线观看日韩视频| 中文字幕在线一区| 婷婷综合激情网| 91欧美激情另类亚洲| 国产精品久久777777毛茸茸| 手机免费观看av| 亚洲国产日韩精品在线| 久久久久伊人| 欧美变态另类刺激| 一色桃子久久精品亚洲| 亚洲人视频在线观看| 成人亲热视频网站| 欧美在线综合| 国产亚洲精久久久久久无码77777| 影音先锋日韩有码| 国产精品视频3p|