日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.Net 内存对象分析

發(fā)布時間:2023/12/4 asp.net 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .Net 内存对象分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在生產(chǎn)環(huán)境中,通過運行日志我們會發(fā)現(xiàn)一些異常問題,此時,我們不能直接拿VS遠(yuǎn)程到服務(wù)器上調(diào)試,同時日志輸出的信息無法百分百反映內(nèi)存中對象的狀態(tài),比如說我們想查看進程中所有的Socket連接狀態(tài)、服務(wù)路由信息等等。

即:如何分析.Net 運行時內(nèi)存對象?

所以,今天我們推薦.Net進階必備神器:Windbg,基于Windbg分析內(nèi)存中對象的狀態(tài)。

還是以實際場景為例吧,這樣可以更加貼合實際應(yīng)用,同時更有借鑒意義。

業(yè)務(wù)場景:分布式環(huán)境下,各個服務(wù)容器進程中緩存了各個服務(wù)的Socket連接信息,方便運行時服務(wù)間相互訪問。但是網(wǎng)絡(luò)是偶爾要抖動的,在抖動的一瞬間,很多Socket連接便中斷了,服務(wù)調(diào)用方收到的異常信息便是:連接已中斷等。

如何快速定位到哪些Socket連接是中斷的?這些中斷的Socket連接是連接的哪些服務(wù)器、端口?這些信息可以幫助我們分析具體的網(wǎng)絡(luò)問題,同時做一些程序上的補償:連接重建。一個目標(biāo),保持程序的高可用性!

那么,請出我們今天的主角:Windbg,微軟的官方介紹:

http://windbg.org/

進一步說,我們需要抓取指定進程某一瞬間的內(nèi)存鏡像,然后使用Windbg分析內(nèi)存中各種對象、線程、線程池、析構(gòu)隊列、堆、CPU內(nèi)核時間片等的狀態(tài)。

因此,第一步,我們需要對要進行內(nèi)存分析的進程,抓取一個Full Dump文件:內(nèi)存鏡像文件。

任務(wù)管理器->選擇進程->創(chuàng)建轉(zhuǎn)儲文件

系統(tǒng)會將Dump文件存儲在指定的目錄,這個目錄需要拷貝一下,以備用。

第二步,從下面路徑下載并安裝Windbg

https://developer.microsoft.com/en-us/windows/hardware/download-windbg

請根據(jù)操作系統(tǒng)的位數(shù),選擇X86或者X64。這里我們用的64位操作系統(tǒng),選擇的Windbg(X64)

第三步:Ctrl+D,打開剛才抓取的Dump文件

第四步:加載調(diào)試用的SOS.dll: .loadby sos clr

.loadby sos clr

第五步:查看內(nèi)存中指定類型的對象?

!dumpheap -Type Socket

這里的Socket是具體的類型,我們要查看Socket連接狀態(tài),所以類型是Socket

這里的Header中MT=Method Table

我們需要用的MT:00007ffafe50d700

第六步,查看內(nèi)存所有所有的Socket對象的地址:

!dumpheap -mt 00007ffafe50d700

?

輸出結(jié)果中,第一列是某一個Socket對象的內(nèi)存地址

此時,我們可以使用下面的命令,隨機查看一個Socket對象的信息:

!do 000001b2d188ae00

!do 的意思:!dumpObj?

?那么問題來了,幾百個Socket對象,如果一個一個!do查看,這工作量太大了! 當(dāng)然不能這么干,Windbg有.foreach命令

?搜索Debugging help.chm文檔,.foreach給了個樣例:

.foreach /f ( place "g:\myfile.txt") { dds place }

即,循環(huán)遍歷一個文本文件,對每一行數(shù)據(jù),執(zhí)行一個命令操作。

好,我們回到我們上一步的輸出中:每個Socket對象的地址列表,我們拷貝出來,用文本編輯工具只取出第一列(Socket地址列),保存成1.txt

第七步:循環(huán)遍歷查看每個內(nèi)存對象

.foreach /f (adr "C:\1.txt") {!do adr}

輸出:

將所有的輸出,拷貝到文本編輯器中,搜索查詢指定的屬性,例如m_IsConnected=0, 即可找出連接斷開的Socket對象,然后進一步用!gcroot 查看這個對象的引用關(guān)系,再一步一步看各個引用對象的信息就可以大致分析了。

原文地址:http://www.cnblogs.com/tianqing/p/7630636.html


.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注

總結(jié)

以上是生活随笔為你收集整理的.Net 内存对象分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。