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

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

開發 前端
在 C# 所處的 Windows 進程中,其實有很多的堆,比如:crt堆,ntheap堆,gc堆,clr私有堆,堆外(VirtualAlloc),調試沒有標準答案,不斷的假設,試探,摸著石頭過河,言外之意就是這個堆沒問題,不代表其他堆也沒有問題,這樣想思路就比較順暢了,我們可以看看其他的堆,比如這里的 CLR私有堆,使用 !eeheap -loader 觀察。

一:背景

1. 講故事

中秋國慶長假結束,哈哈,在老家拍了很多的短視頻,有興趣的可以上B站觀看:https://space.bilibili.com/409524162 ,今天繼續給大家分享各種奇奇怪怪的.NET生產事故,希望能幫助大家在未來的編程之路上少踩坑。

話不多說,這篇看一個.NET程序集泄露導致的CLR私有堆泄露的案例,這個泄露和 JsonConvert 有關,哈哈,相信你肯定比較驚訝!

二:WinDbg 分析

1. 到底是哪里的泄露

首先觀察一下進程的提交內存的大小,即通過 !address -summary 觀察。

0:000> !address -summary
--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
Free                                    390     7dfa`63fa8000 ( 125.978 TB)           98.42%
<unknown>                             13628      205`32974000 (   2.020 TB)  99.92%    1.58%
Heap                                   8143        0`4042b000 (   1.004 GB)   0.05%    0.00%
Stack                                   186        0`1f8e0000 ( 504.875 MB)   0.02%    0.00%
Image                                  1958        0`09775000 ( 151.457 MB)   0.01%    0.00%
Other                                     9        0`001d7000 (   1.840 MB)   0.00%    0.00%
TEB                                      62        0`0007c000 ( 496.000 kB)   0.00%    0.00%
PEB                                       1        0`00001000 (   4.000 kB)   0.00%    0.00%

--- Type Summary (for busy) ------ RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_MAPPED                              312      200`00a06000 (   2.000 TB)  98.92%    1.56%
MEM_PRIVATE                           21717        5`91ecd000 (  22.280 GB)   1.08%    0.02%
MEM_IMAGE                              1958        0`09775000 ( 151.457 MB)   0.01%    0.00%

--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_FREE                                390     7dfa`63fa8000 ( 125.978 TB)           98.42%
MEM_RESERVE                            4509      205`0fc14000 (   2.020 TB)  99.89%    1.58%
MEM_COMMIT                            19478        0`8c434000 (   2.192 GB)   0.11%    0.00%

當前的提交內存占用了 2.19G,進程堆占用 1G ,差不多占了一半,但不能說明就是非托管內存泄露,接下來繼續觀察下托管堆。

0:000> !eeheap -gc
Number of GC Heaps: 8
------------------------------
Heap 7 (000001C4971013A0)
generation 0 starts at 0x000001C817D201A0
generation 1 starts at 0x000001C817C878D8
generation 2 starts at 0x000001C817261000
ephemeral segment allocation context: none
         segment             begin         allocated              size
000001C817260000  000001C817261000  000001C819013F98  0x1db2f98(31141784)
Large object heap starts at 0x000001C907261000
         segment             begin         allocated              size
000001C907260000  000001C907261000  000001C907261018  0x18(24)
Pinned object heap starts at 0x000001C987261000
000001C987260000  000001C987261000  000001C9872ABA50  0x4aa50(305744)
Heap Size:       Size: 0x1dfda00 (31447552) bytes.
------------------------------
GC Heap Size:    Size: 0xba26488 (195191944) bytes.

從卦中可以看到當前的托管堆占用僅 195M,這就更好的驗證當前確實存在非托管內存泄露,由于非托管內存沒有開啟 ust,也沒有 perfview 的etw文件,所以沒有好的方式進一步挖掘,到這里可能就止步不前了。

2. 到底是哪里的泄露

在 C# 所處的 Windows 進程中,其實有很多的堆,比如:crt堆,ntheap堆,gc堆,clr私有堆,堆外(VirtualAlloc),調試沒有標準答案,不斷的假設,試探,摸著石頭過河,言外之意就是這個堆沒問題,不代表其他堆也沒有問題,這樣想思路就比較順暢了,我們可以看看其他的堆,比如這里的 CLR私有堆,使用 !eeheap -loader 觀察。

0:000> !eeheap -loader
Loader Heap:
--------------------------------------
...
Module 00007ff846e034c0: Size: 0x0 (0) bytes.
Module 00007ff846e03930: Size: 0x0 (0) bytes.
Module 00007ff846e04180: Size: 0x0 (0) bytes.
Module 00007ff846e047e0: Size: 0x0 (0) bytes.
Module 00007ff846e04e40: Size: 0x0 (0) bytes.
Total size:      Size: 0x0 (0) bytes.
--------------------------------------
Total LoaderHeap size:   Size: 0x47252000 (1193615360) bytes total, 0x1f68000 (32931840) bytes wasted.
=======================================

從卦中可以看到有非常多的 module 迸射出來,估計有幾萬個,并且可以看到總的大小是 1.19G,到這里基本就搞清楚了,然來是 程序集泄露。

這里稍微補充一下,像這種問題早期可以使用 dotnet-counter 或者 Windows 的程序集指標 監控一下,或許你就能輕松找出原因,截圖如下:

PS C:\Users\Administrator\Desktop> dotnet-counters monitor -n WebApplication2

圖片圖片

而且 dotnet-counter 還是跨平臺的,非常實用,大家可以琢磨琢磨,接下來抽一個module 用命令 !dumpmodule -mt 00007ff846e034c0 觀察下,內部到底有哪些類型。

0:000> !dumpmodule -mt 00007ff846e034c0
Name: Unknown Module
Attributes:              Reflection IsDynamic IsInMemory 
Assembly:                000001c9e193b9e0
BaseAddress:             0000000000000000
...

Types defined in this module

              MT          TypeDef Name
------------------------------------------------------------------------------
00007ff846e03db0 0x02000002 

Types referenced in this module

              MT            TypeRef Name
------------------------------------------------------------------------------
00007ff820ff5748 0x02000002 xxx.xxx.Json.Converters.PolymorphismConverter`1
00007ff820e710f8 0x02000003 xxx.xxx.Models.IApiResult

0:000> !dumpmt -md 00007ff846e03db0
Number of IFaces in IFaceMap: 0
--------------------------------------
MethodDesc Table
           Entry       MethodDesc    JIT Name
00007FF822F05FA8 00007ff823285b50   NONE xxx.Json.Converters.PolymorphismConverter`1
00007FF822EFD5E8 00007ff82323b1b8   NONE System.Text.Json.Serialization.JsonConverter`1
00007FF822EFD5F0 00007ff82323b1c8   NONE System.Text.Json.Serialization.JsonConverter`1
00007FF8414CB978 00007ff846e03d88    JIT IApiResultDynamicJsonConverter..ctor()

仔細分析卦中信息,可以很明顯的看到。

  • Json.Converters.PolymorphismConverter

看樣子和牛頓有關系,并且還是一個自定義的 JsonConvert。

  • IApiResult 和 IApiResultDynamicJsonConverter

看樣子是一個接口的返回協議類,需要在代碼中重點關注。

有了這些信息,接下來就是重點關注代碼中的 PolymorphismConverter 類,果然就找到了一處。

圖片圖片

從類的定義來看,一般這種東西都是在 ConfigureServices 方法中做 初始化定義 的,按理說問題不大,那為什么會有問題呢?還得要查下它的引用,終于給找到了,截圖如下:

圖片圖片

這是一個低級錯誤哈,每次讀取 ApiResult.Data 的時候都要 jsonSerializerOptions.AddPolymorphism(); 操作,也就每次都會創建程序集,終于真相大白。

三:總結

這種程序集泄露導致的生產事故不應該哈,反應了團隊中多人協作的時候還是有待提高!

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

2023-09-26 01:11:58

MES非托管泄露

2022-10-09 10:47:37

NET視覺軟件

2022-09-13 17:46:19

STA模式內存

2023-07-06 10:11:38

.NET模式dump

2024-12-27 13:31:18

.NETdump調試

2023-09-27 07:23:10

.NET監控軟件

2023-05-15 11:15:50

.NET門診語句

2024-05-31 12:56:06

.NET代碼方法

2023-06-26 00:12:46

2023-04-06 10:52:18

2024-03-28 12:56:36

2024-07-12 11:20:34

.NET崩潰視覺程序

2023-03-26 20:24:50

ERP網站系統

2024-03-26 00:44:53

.NETCIM系統

2022-10-13 18:40:05

.NETOA后端

2024-05-20 09:39:02

.NETurl線程池

2021-10-27 07:30:32

.NETCPU論壇

2022-10-25 14:17:01

.NET代碼程序

2024-09-14 10:28:56

.NET卡死程序

2024-07-01 13:00:24

.NET網絡邊緣計算
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色眯眯视频在线观看 | 免费成人国产 | 日本精品视频 | 久免费视频| 久久久国产亚洲精品 | 日韩小视频 | 国产精品视频免费观看 | 久久综合伊人 | 午夜免费视频 | 人人做人人澡人人爽欧美 | 超碰欧美 | 日韩午夜激情 | 性生活毛片 | 中文字幕1区 | 日韩精品视频在线 | 99久久婷婷国产亚洲终合精品 | 四虎影视免费观看 | 亚洲情视频 | 成人欧美一区二区三区在线观看 | 国产亚洲精品精品国产亚洲综合 | 精品国产1区2区3区 在线国产视频 | 欧美在线资源 | 亚洲成人精品免费 | 国产偷录叫床高潮录音 | 国产亚洲精品久久yy50 | 国产视频综合 | 韩日一区二区 | 三区在线 | 日韩一二三 | 亚洲性人人天天夜夜摸 | 黄视频免费 | 在线国产一区 | 97caoporn国产免费人人 | 国产精品久久久久久238 | 在线只有精品 | 中文字幕蜜臀av | 国产美女免费视频 | 一区二区三区免费 | 日韩福利在线观看 | 亚洲欧美一区二区三区国产精品 | 亚洲品质自拍视频 |