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

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

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

一:背景

1. 講故事

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

雖然知道分析起來難度可能會很大,但該分析還是要分析的,讓朋友抓一個 dump 過來,上 WinDbg 說話。

二:WinDbg 分析

1. 到底是哪里的泄露

只要是進程都會有內(nèi)存段的,所以分析Linux的dump一樣可以使用 !address -summary 命令來觀察。


0:000> !address -summary

--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
<unknown>                              1607 ffffffff`cd7a9e00 (  16.000 EB) 100.00%  100.00%
Image                                 41699        0`31e57200 ( 798.340 MB)   0.00%    0.00%

--- Type Summary (for busy) ------ RgnCount ----------- Total Size -------- %ofBusy %ofTotal
                                       1247 fffffffe`1c910000 (  16.000 EB)          100.00%
MEM_PRIVATE                           42059        1`e2cf1000 (   7.544 GB)   0.00%    0.00%

--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
                                       1247 fffffffe`1c910000 (  16.000 EB) 100.00%  100.00%
MEM_COMMIT                            42059        1`e2cf1000 (   7.544 GB)   0.00%    0.00%

--- Protect Summary (for commit) - RgnCount ----------- Total Size -------- %ofBusy %ofTotal
PAGE_READWRITE                        41067        1`cff54000 (   7.249 GB)   0.00%    0.00%
PAGE_READONLY                           644        0`07268000 ( 114.406 MB)   0.00%    0.00%
PAGE_EXECUTE_READ                       223        0`06d1f000 ( 109.121 MB)   0.00%    0.00%
PAGE_EXECUTE_WRITECOPY                  125        0`04e16000 (  78.086 MB)   0.00%    0.00%

--- Largest Region by Usage ----------- Base Address -------- Region Size ----------
<unknown>                              7ffc`78f8e000 ffff8003`86672000 (  16.000 EB)
Image                                  7ff8`49102000        0`10000000 ( 256.000 MB)

這里簡單提一下,我發(fā)現(xiàn)有很多朋友搞不清楚這里的 16.000 EB 是什么意思,它其實是2的64次方,即程序的用戶態(tài)空間的尋址范圍。

從卦中的 MEM_COMMIT=7.544G 來看當前提交內(nèi)存不小,接下來用 !eeheap -gc 觀察下托管堆內(nèi)存占用。


0:000> !eeheap -gc

========================================
Number of GC Heaps: 1
----------------------------------------
generation 0 starts at 7ff688f78f10
generation 1 starts at 7ff688484e70
generation 2 starts at 7ff8f7fff000
ephemeral segment allocation context: none
Small object heap
         segment            begin        allocated        committed allocated size         committed size        
    7ff63fffa000     7ff63fffb000     7ff64fe51d80     7ff64fe5d000 0xfe56d80 (266694016)  0xfe63000 (266743808) 
    7ff6772c8000     7ff6772c9000     7ff6872c2d38     7ff6872c8000 0xfff9d38 (268410168)  0x10000000 (268435456)
    7ff74bffe000     7ff74bfff000     7ff75bffdfc0     7ff75bffe000 0xfffefc0 (268431296)  0x10000000 (268435456)
    7ff773ffe000     7ff773fff000     7ff783ffdfc8     7ff783ffe000 0xfffefc8 (268431304)  0x10000000 (268435456)
    7ff849102000     7ff849103000     7ff859101fe8     7ff859102000 0xfffefe8 (268431336)  0x10000000 (268435456)
    7ff8f7ffe000     7ff8f7fff000     7ff907ffce88     7ff907ffe000 0xfffde88 (268426888)  0x10000000 (268435456)
    7ff6872ca000     7ff6872cb000     7ff68a768438     7ff68aa4b000 0x349d438 (55170104)   0x3781000 (58200064)  
Large object heap starts at 7ff907fff000
         segment            begin        allocated        committed allocated size         committed size        
    7ff733ff8000     7ff733ff9000     7ff73aedd058     7ff73aefe000 0x6ee4058 (116277336)  0x6f06000 (116416512) 
    7ff743ffc000     7ff743ffd000     7ff744358f10     7ff744379000 0x35bf10 (3522320)     0x37d000 (3657728)    
    7ff7a3ffe000     7ff7a3fff000     7ff7a9d63ee0     7ff7a9d84000 0x5d64ee0 (97930976)   0x5d86000 (98066432)  
    7ff7bbffe000     7ff7bbfff000     7ff7c3dc1090     7ff7c3de2000 0x7dc2090 (131866768)  0x7de4000 (132005888) 
    7ff907ffe000     7ff907fff000     7ff90f048b30     7ff90f069000 0x7049b30 (117742384)  0x706b000 (117878784) 
Pinned object heap starts at 7ff90ffff000
         segment            begin        allocated        committed allocated size         committed size        
    7ff90fffe000     7ff90ffff000     7ff9102d15b0     7ff9102d2000 0x2d25b0 (2958768)     0x2d4000 (2965504)    
------------------------------
GC Allocated Heap Size:    Size: 0x7f36bca0 (2134293664) bytes.
GC Committed Heap Size:    Size: 0x7f710000 (2138112000) bytes.

從卦中看當前提交內(nèi)存也僅有 2.13G,這和 7.5G 相距甚遠,說明這是最復雜的 非托管內(nèi)存泄漏。

2. 非托管泄露分析

作為一個.NET調(diào)試者,需要像醫(yī)生一樣盡自己最大可能救治病人,那接下來我們的研究方向在哪里呢?大家需要知道所有的內(nèi)存占用的基本盤都在 虛擬地址 上,結(jié)果一搜索,發(fā)現(xiàn)有大概 4w+ 的 dll,一個程序怎么可能會有這么多動態(tài)鏈接庫呢?截圖如下:

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

既然找到了可疑之處那就繼續(xù)挖吧,接下來就是要考慮這個dll是托管代碼創(chuàng)建的還是非托管代碼創(chuàng)建的,用排除法就好了,如果是托管代碼創(chuàng)建的,那就肯定屬于 Assembly 下的某一個module,可以查下加載堆看看。


0:000> !eeheap -loader
Loader Heap:
--------------------------------------
...
Module 00007ff95e265778: Size: 0x0 (0) bytes.
Module 00007ff95e2661e0: Size: 0x0 (0) bytes.
Module 00007ff95e266c48: Size: 0x0 (0) bytes.
Module 00007ff95e2676b0: Size: 0x0 (0) bytes.
Module 00007ff95e268118: Size: 0x0 (0) bytes.
Module 00007ff95e268b80: Size: 0x0 (0) bytes.
Module 00007ff95e2695e8: Size: 0x0 (0) bytes.
Total size:      Size: 0x0 (0) bytes.
--------------------------------------
Total LoaderHeap size:   Size: 0x4bf4b000 (1274327040) bytes total, 0x4da000 (5087232) bytes wasted.
=======================================

0:000> !dumpmodule 00007ff95e2695e8
Name: *75db8939-8b3a-4075-94ac-e9bb52acf9d1#40147-0.dll
Attributes:              PEFile IsInMemory IsFileLayout 
...
MetaData start address:  00007FF85BBCD330 (2068 bytes)

0:000> !DumpAssembly /d 00007ff80d71bba0
Parent Domain:      0000559009249080
Name:               Unknown
ClassLoader:        00007FF80D71BC00
  Module
  00007ff95e2695e8    *75db8939-8b3a-4075-94ac-e9bb52acf9d1#40147-0.dll

從卦中看雖然加載堆只有 1.27G,但它還有很多關(guān)聯(lián)的內(nèi)存,而且動態(tài)module高多4w+,接下來用 !dumpmodule -mt 觀察內(nèi)部是什么類型。


0:000> !dumpmodule -mt 00007ff95e2695e8
Name: *75db8939-8b3a-4075-94ac-e9bb52acf9d1#40147-0.dll
Attributes:              PEFile IsInMemory IsFileLayout 
...
Types defined in this module

              MT          TypeDef Name
------------------------------------------------------------------------------
00007ff95e269d80 0x02000004 Submission#0
00007ff95e269ec0 0x02000005 Submission#0+<>d__0

Types referenced in this module

              MT            TypeRef Name
------------------------------------------------------------------------------
00007ff92d6152a8 0x0200000c System.Object
00007ff92ead4d18 0x0200000d System.Threading.Tasks.Task`1
00007ff93133f298 0x0200000e System.Runtime.CompilerServices.IAsyncStateMachine
00007ff92d6cec90 0x0200000f System.Exception
00007ff93133f648 0x02000010 System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1

0:000> !dumpmt -md 00007ff95e269ec0
...
MethodDesc Table
           Entry       MethodDesc    JIT Name
00007FF92D620030 00007ff92d615238    JIT System.Object.Finalize()
00007FF92D620038 00007ff92d615248 PreJIT System.Object.ToString()
00007FF92D620040 00007ff92d615258    JIT System.Object.Equals(System.Object)
00007FF92D620058 00007ff92d615298    JIT System.Object.GetHashCode()
00007FF95DFFB0E0 00007ff95e269e58    JIT Submission#0+<>d__0.MoveNext()
00007FF95DFF9B70 00007ff95e269e78   NONE Submission#0+<>d__0.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)
00007FF95DFF9B60 00007ff95e269e48    JIT Submission#0+<>d__0..ctor()

從卦中看也只能看到一些 Submission 為前綴的類與之相關(guān)的狀態(tài)機類,也看不出來是誰創(chuàng)建的,結(jié)果又入了困境。

3. 到底是誰作的孽

要想獲取動態(tài)程序集的創(chuàng)建事件,有一個好辦法就是用跨平臺的 dotnet-trace,讓它捕獲程序集的加載事件即可,詳情可參考:https://learn.microsoft.com/en-us/dotnet/core/dependency-loading/collect-details ,然后讓朋友跑 30min 看看,參考命令如下:


dotnet-trace collect -p 4108 --clrevents loader --duration 00:00:30:00

有了生成好的 dotnet_xxxx.nettrace 之后就可以用 perfview 觀察了,打開 Event視圖,搜索 AssemblyLoad 事件,截圖如下:

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

通過 Time MSec 的748前綴來看,這1s種能生成幾十個動態(tài)程序集,接下來右鍵選擇 Open Any Stacks 觀察是什么代碼調(diào)用的,截圖如下:

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

從 perfivew 的輸出看,原來是 XXXCusDis 方法內(nèi)部調(diào)用 Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.EvaluateAsync 生成了非常多的程序集。

最后就是把 CSharpScript.EvaluateAsync 告訴朋友,能不能給剔除掉做個排查?

三:總結(jié)

網(wǎng)上查了下 Microsoft.CodeAnalysis.CSharp.Scripting 可以用來生成C#腳本代碼,大家在用的時候小心點吧。文章來源地址http://www.zghlxwxcb.cn/news/detail-632821.html

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

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

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

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

相關(guān)文章

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

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

    昨晚給訓練營里面的一位朋友分析了一個程序崩潰的故障,因為看小伙子昨天在群里問了一天也沒搞定,干脆自己親自上陣吧,抓取的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 某券商論壇系統(tǒng) 卡死分析

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

    前幾個月有位朋友找到我,說他們的的web程序沒有響應了,而且監(jiān)控發(fā)現(xiàn)線程數(shù)特別高,內(nèi)存也特別大,讓我?guī)兔匆幌略趺椿厥拢F(xiàn)在回過頭來幾經(jīng)波折,回味價值太濃了。 這個程序內(nèi)存高,線程高,無響應,尼瑪是一個復合態(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某列控連鎖系統(tǒng) 崩潰分析

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

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

    2024年02月21日
    瀏覽(21)
  • 記一次 .NET 某埋線管理系統(tǒng) 崩潰分析

    記一次 .NET 某埋線管理系統(tǒng) 崩潰分析

    經(jīng)常有朋友跟我反饋,說看你的文章就像看天書一樣,有沒有一些簡單入手的dump 讓我們先找找感覺,哈哈,今天就給大家?guī)硪黄腴T級的案例,這里的入門是從 WinDbg 的角度來闡述的,這個問題如果你通過 記日志,分析代碼 的方式,可能真的無法解決,不信的話繼續(xù)往下

    2024年02月11日
    瀏覽(23)
  • 記一次 .NET 某工控視覺系統(tǒng) 卡死分析

    記一次 .NET 某工控視覺系統(tǒng) 卡死分析

    前段時間有位朋友找到我,說他們的工業(yè)視覺軟件僵死了,讓我?guī)兔聪碌降资鞘裁辞闆r,哈哈,其實卡死的問題相對好定位,無非就是看主線程棧嘛,然后就是具體問題具體分析,當然難度大小就看運氣了。 前幾天看一篇文章說現(xiàn)在的 .NET程序員 不需要學習 WinDbg ,理由就

    2024年02月12日
    瀏覽(21)
  • 記一次 .NET某道閘收費系統(tǒng) 內(nèi)存溢出分析

    記一次 .NET某道閘收費系統(tǒng) 內(nèi)存溢出分析

    前些天有位朋友找到我,說他的程序幾天內(nèi)存就要爆一次,不知道咋回事,找不出原因,讓我?guī)兔匆幌?,這種問題分析dump是最簡單粗暴了,拿到dump后接下來就是一頓分析。 程序既然會爆,可能是虛擬地址受限,也可能是系統(tǒng)內(nèi)存不足,可以用 !address -summary 觀察下。 從卦

    2024年01月18日
    瀏覽(20)
  • 記一次 .NET 某藥材管理系統(tǒng) 卡死分析

    記一次 .NET 某藥材管理系統(tǒng) 卡死分析

    前段時間有位朋友找到我,說他們在查詢報表的時候發(fā)現(xiàn)程序的穩(wěn)定性會受到影響,但服務器的內(nèi)存,CPU都是正常的,讓我?guī)兔聪略趺椿厥?,問了下程序的穩(wěn)定性指的是什么?指的是卡死,那既然是卡死,就抓一個卡死的dump吧。 不同的程序類型分析卡死的思路是不一樣的

    2024年02月09日
    瀏覽(30)
  • 記一次 .NET 某零售管理系統(tǒng) 存儲不足分析

    記一次 .NET 某零售管理系統(tǒng) 存儲不足分析

    前幾天有位朋友找到我,說他的程序會偶發(fā)性的報 存儲空間不足,無法處理此命令 的錯誤,讓我?guī)兔聪碌降自趺椿厥?,哈哈,人家是有備而來,dump都準備好了,話不多說,直接分析開干。 一般來講別人說的只是一個參考,我們需要自己到dump中去驗證,可以用 !t 觀察下。

    2024年02月05日
    瀏覽(23)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包