1. 程式人生 > >Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的資料 Managed Heap

Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的資料 Managed Heap

摘要 :

NetExt中有兩個比較常用的命令可以用來分析heap上面的物件. 一個是!wheap, 另外一個是!windex.

!wheap 這個命令可以用於打印出heap structure資訊. heap 上 object彙總後的資訊. 這個命令也可以按照一些條件過濾出objects, 不過執行速度比較慢. 在這一點上, 更推薦!windex.
!windex是一個非常常用的命令. 這個命令可以用來查詢heap上面實現某個interface, 繼承某個abstract class 或者class的物件. 這個命令執行之後, 也會快取做過index後的物件, 可以加快類似命令的之行速度. 同時也有非常酷炫的功能, 可以批量的從同一型別的object中顯示出個別欄位.

!wheap

!wheap 這個命令可以用於打印出heap structure資訊. 以及heap object的彙總後的資訊.  加上引數 –detailsonly, 正如他的名字一樣, 可以打印出詳細的資訊.

它可以顯示出的Heap的數量, 由於這個CLR RUTIME使用的GC Mode是Server Mode (1). 那麼Heap的數量會根據Processor的數量有所不同. 這裡能夠看到Heap的數量是2個.

關於GC 型別的區別, 可以參考下面的連結

從輸出結果可以看出來每個Managed Heap都有自己的一段地址. 如果Heap的size比較大, 還會包含多個Segment. 每個Segment的最大值都是固定的. 最大值值由很多因素決定. 不同的環境和配置時, 這個值會不一樣. 當一個Segment將要分配滿的時候, 會創建出一個新的Segment. 這個Segment 會緩慢增長, 直到長滿為止.

這個命令也會提示GC Heap 上不同Generation代上的object的數量. 比較特別的是 Generation 3. 我們所認識的Generation 3. 

0:000> !wheap -detailsonly
Heaps: 2           <-- heap 的數量 --> 
Server Mode: 1   <-- GC Mode, 1表示是Server Mode --> 
Heap [0]:                <-- 第一個Heap -->
    Allocated: 0000000155a56fe8
    Card Table: 00000000027ea6b0
    Ephemeral Heap Segment: 0000000155660000
    Finalization Fill Pointers: 000000c28007cd40
    Heap Address: 0000000000e1e790
    Lowest Address: 0000000155660000
    Highest Address: 00000001f5660000
    Generation Addresses:
        [0]:AllocStart(0000000155793728),AllocCxtLimit(0000000000000000),AllocCtxPtr(0000000000000000),StartSeg(0000000155660000)
        [1]:AllocStart(0000000155660080),AllocCxtLimit(0000000000000000),AllocCtxPtr(0000000000000000),StartSeg(0000000155660000)
        [2]:AllocStart(0000000155660068),AllocCxtLimit(0000000000000000),AllocCtxPtr(0000000000000000),StartSeg(0000000155660000)
        [3]:AllocStart(00000001d5660068),AllocCxtLimit(0000000000000000),AllocCtxPtr(0000000000000000),StartSeg(00000001d5660000)

Segments:
Segment: 0000000155660000 Start: 0000000155660068 End: 0000000155981340 HiMark: 0000000155a56fe8 Committed: 0000000155a61000 Reserved: 0000000195660000 Next: 0000000000000000  
<-- 第一個Segment, 由於有第二個Segment已經創建出來, 可以猜測這個Segment已經快分配完. 用End的地址減去Start的地址能夠算出一個Segment的大小. 這裡是64MB. --> Segment: 00000001d5660000 Start: 00000001d5660068 End: 00000001d569bf10 HiMark: 00000001d569bf10 Committed: 00000001d56a1000 Reserved: 00000001e5660000 Next: 0000000000000000 Heap [1]: Allocated: 0000000195907af8 Card Table: 00000000027ea6b0 Ephemeral Heap Segment: 0000000195660000 Finalization Fill Pointers: 000000c28007cd40 Heap Address: 0000000000e20db0 Lowest Address: 0000000155660000 Highest Address: 00000001f5660000 Generation Addresses: [0]:AllocStart(000000019573e270),AllocCxtLimit(0000000000000000),AllocCtxPtr(0000000000000000),StartSeg(0000000195660000) [1]:AllocStart(0000000195660080),AllocCxtLimit(0000000000000000),AllocCtxPtr(0000000000000000),StartSeg(0000000195660000) [2]:AllocStart(0000000195660068),AllocCxtLimit(0000000000000000),AllocCtxPtr(0000000000000000),StartSeg(0000000195660000) [3]:AllocStart(00000001e5660068),AllocCxtLimit(0000000000000000),AllocCtxPtr(0000000000000000),StartSeg(00000001e5660000) Segments: Segment: 0000000195660000 Start: 0000000195660068 End: 0000000195907af8 HiMark: 0000000195907af8 Committed: 0000000195911000 Reserved: 00000001d5660000 Next: 0000000000000000 Segment: 00000001e5660000 Start: 00000001e5660068 End: 00000001e5660080 HiMark: 00000001e5660080 Committed: 00000001e5661000 Reserved: 00000001f5660000 Next: 0000000000000000 Heap Areas: Area [0000000155660068]: 0000000155660068-0000000155660080 ( 24) Heap: 0 Generation: 2 Large: 0 <-- 表示 24個物件處於Generation 2 --> Area [0000000155660080]: 0000000155660080-0000000155793728 ( 1259176) Heap: 0 Generation: 1 Large: 0 Area [0000000155793728]: 0000000155793728-0000000155a61000 ( 2939096) Heap: 0 Generation: 0 Large: 0 Area [0000000195660068]: 0000000195660068-0000000195660080 ( 24) Heap: 1 Generation: 2 Large: 0 Area [0000000195660080]: 0000000195660080-000000019573e270 ( 909808) Heap: 1 Generation: 1 Large: 0 Area [000000019573e270]: 000000019573e270-0000000195911000 ( 1912208) Heap: 1 Generation: 0 Large: 0 Area [00000001d5660068]: 00000001d5660068-00000001d569bf10 ( 245416) Heap: 0 Generation: 3 Large: 1 <-- 表示 245416個物件處於Generation 3, 即Large Object Heap --> Area [00000001e5660068]: 00000001e5660068-00000001e5660080 ( 24) Heap: 1 Generation: 3 Large: 1 0000000155660068 0000000000e111d0 24 0 2 Free 0000000155660080 0000000000e111d0 24 0 1 Free 0000000155660098 0000000000e111d0 24 0 1 Free 00000001556600b0 000007fef0b96cb8 160 0 1 System.Exception 0000000155660150 000007fef0b96f10 160 0 1 System.OutOfMemoryException 00000001556601f0 000007fef0b96f98 160 0 1 System.StackOverflowException 0000000155660290 000007fef0b97020 160 0 1 System.ExecutionEngineException 0000000155660330 000007fef0b970a8 160 0 1 System.Threading.ThreadAbortException 00000001556603d0 000007fef0b970a8 160 0 1 System.Threading.ThreadAbortException ..... 0000000195747da0 000007fee67a1e60 32 1 0 System.Xml.Schema.XmlSchemaObjectTable+ValuesCollection 0000000195747dc0 000007fee67a1f28 56 1 0 System.Xml.Schema.XmlSchemaObjectTable+XSOEnumerator 0000000195747df8 000007fef0b9c768 36 1 0 System.Int32[] 0000000195747e20 000007fee67a2048 96 1 0 System.Collections.Generic.Dictionary`2+Entry[[System.Xml.XmlQualifiedName, System.Xml],[System.Xml.Schema.XmlSchemaObject, System.Xml]][] 0000000195747e80 000007fee679fd20 88 1 0 System.Xml.Schema.XmlSchemaObjectTable+XmlSchemaObjectEntry[] 0000000195747ed8 000007fee67a1e60 32 1 0 System.Xml.Schema.XmlSchemaObjectTable+ValuesCollection 00000001d5660068 0000000000e111d0 24 0 3 Free 00000001d5660080 000007fef0b9adf8 8192 0 3 System.Object[] ..... This output was throttled. Only the first 500 objects of each heap range has been shown. Use -nothrottle to list all objects or any limiting parameter (-type for example)
View Code

- detailsonly 的目的是打印出來Heap的structure的資訊. Object僅僅列印前500個. 如果要打印出的Heap上所有的物件, 則要使用引數 –nothrottle, 不過這一命令的執行時間會略長.

用-start 以及 –end 引數, 可以打印出一個範圍內的object的資料.

用 –mt  <string>引數, 可以打印出指定的MethodTable值的objects. 類似於命令!gcheap –mt <addr>

!wheap的顯示結果會統計出Heap上Object的一些彙總資訊. 這些資訊是按照物件型別進行分類, 一條資料表示一個物件型別.

第一列是其中一個object的地址, 如果有多個物件是相同型別, 僅僅顯示第一個.

第二列是這個型別的物件的MethodTable的地址.

第三列是這個型別的總共使用了多少virtual memory. 在做high memory 的場景的CASE的情況下, 可以通過這個值快速找到佔用virtual memory 最高的物件型別.

第四列是這個型別的數量.

第五列是這個型別的名稱

!wheap

…….

0000000195747d18 000007fef0b9c768       36   1 0 System.Int32[]
0000000195747d40 000007fee679a850       96   1 0 System.Collections.Generic.Dictionary`2+Entry[[System.Xml.XmlQualifiedName, System.Xml],[System.Xml.Schema.SchemaAttDef, System.Xml]][]
0000000195747da0 000007fee67a1e60       32   1 0 System.Xml.Schema.XmlSchemaObjectTable+ValuesCollection
0000000195747dc0 000007fee67a1f28       56   1 0 System.Xml.Schema.XmlSchemaObjectTable+XSOEnumerator
0000000195747df8 000007fef0b9c768       36   1 0 System.Int32[]
0000000195747e20 000007fee67a2048       96   1 0 System.Collections.Generic.Dictionary`2+Entry[[System.Xml.XmlQualifiedName, System.Xml],[System.Xml.Schema.XmlSchemaObject, System.Xml]][]
0000000195747e80 000007fee679fd20       88   1 0 System.Xml.Schema.XmlSchemaObjectTable+XmlSchemaObjectEntry[]
0000000195747ed8 000007fee67a1e60       32   1 0 System.Xml.Schema.XmlSchemaObjectTable+ValuesCollection
View Code

!windex

!windex是一個非常常用的命令. 這個命令不但可以早heap中挖掘你所需要的某個型別的資料. 最有用處的地方是, 可以用來查詢heap上面實現某個interface, 繼承某個abstract class 或者class的物件. 這個命令執行之後, 也會快取做過index後的物件, 可以加快類似命令的之行速度.

下面SHOW一下!windex比較有趣的功能, 通過WINDBG的UI將heap上個object展示成樹形結構. 這樣的做法比較形象的對各種物件進行分析.

首先在windbg中執行!windex -tree的命令. 這個命令會快速對heap上的object做index. 然後生成一個臨時檔案在本地. 同時也生成了一條命令.

0:000> !windex -tree
Starting indexing at 20:19:06 PM
Indexing finished at 20:19:07 PM
7,098,503 Bytes in 77,156 Objects
Index took 00:00:01
Copy, paste and run command below:
.cmdtree C:\Users\sonicguo\AppData\Local\Temp\HEAE0D6.tmp

image 

將這個命令COPY & PASTE 到命令列上執行. 然後會彈出另外一個視窗, 如下圖.  這個圖的效果已經非常有點接近Visual Studio中檢查object的視窗效果了.

image

這個時候可以double click 某一條記錄. 會顯示出該條記錄的詳情.

0:000> !windex -mt 000007FEE79EFA20
Index is up to date
 If you believe it is not, use !windex -flush to force reindex
00000001556ebc68 000007fee79efa20 System.ServiceModel.BasicHttpBinding      112   0 1
00000001556f2b88 000007fee79efa20 System.ServiceModel.BasicHttpBinding      112   0 1

如果雙擊的不是這個型別, 而是該型別下面某一個field, 那麼會顯示出所有這個型別的每一個欄位的值. 例如這裡BasicHttpBinding有兩個. 我想知道每一個BasicHttpBinding的name. 那麼只要雙擊這個name, 就會把兩個BasicHttpBinding的名字都打印出來.

這個方式非常適合快速調查某一個型別的特定欄位的值.

image

0:000> .foreach({$addr} {!windex -short -mt 000007FEE79EFA20}){.echo Address: {$addr}; !wselect name from {$addr}}
Address: 00000001556ebc68
[System.ServiceModel.BasicHttpBinding]
System.String name = 00000001556ccbd8 wsHttpBindingConfiguration
Address: 00000001556f2b88
[System.ServiceModel.BasicHttpBinding]
System.String name = 00000001556ce118 basicHttpBindingConfigurationJava

!windex 還支援模糊查詢. 例如, 執行下面這個命令就可以把所有後綴為BasicHttpBinding的物件都打印出來.

0:000> !windex -type *.BasicHttpBinding
Index is up to date
 If you believe it is not, use !windex -flush to force reindex
00000001556ebc68 000007fee79efa20 System.ServiceModel.BasicHttpBinding      112   0 1
00000001556f2b88 000007fee79efa20 System.ServiceModel.BasicHttpBinding      112   0 1

配合 !wfrom 來使用, 可以從過濾出來的物件中找到某一個指定的欄位, 前提是要知道欄位名稱.

0:000> !wfrom -type *.BasicHttpBinding select name
name: wsHttpBindingConfiguration
name: basicHttpBindingConfigurationJava

2 Object(s) listed

這個顯示結果雖然很爽, 但是沒有能夠看到物件的地址, 略微不足. 為了彌補這個不足, 可以使用額外的引數 $addr() 來解決.

0:000> !wfrom -type *.BasicHttpBinding select $addr(),name
calculated: 00000001556EBC68
name: wsHttpBindingConfiguration
calculated: 00000001556F2B88
name: basicHttpBindingConfigurationJava

不僅如此, 還可以用$a()的引數來新增別名, 使得輸出結果可讀性更強.

0:000> !wfrom -type *.BasicHttpBinding select $a("Address",$addr()), $typename(), name
Address: 00000001556EBC68
calculated: System.ServiceModel.BasicHttpBinding
name: wsHttpBindingConfiguration
Address: 00000001556F2B88
calculated: System.ServiceModel.BasicHttpBinding
name: basicHttpBindingConfigurationJava

2 Object(s) listed


這麼多的新功能, 是否覺得酷炫吊炸天呢? 下一期, 我會繼續介紹更多酷炫的新功能.

Sonic Guo

相關推薦

Windbg Extension NetExt 使用指南 3 ---- 挖掘資料 Managed Heap

摘要 : NetExt中有兩個比較常用的命令可以用來分析heap上面的物件. 一個是!wheap, 另外一個是!windex. !wheap 這個命令可以用於打印出heap structure資訊. heap 上 object彙總後的資訊. 這個命令也可以按照一些條件過濾出objects, 不過執行速度比

企業IT管理員IE11升級指南3—— IE11 新的GPO設定

企業IT管理員IE11升級指南 系列: IE11 新的GPO設定 MSDN文件詳細介紹了IE11新增的組策略 Internet Explorer 11 的新組策略設定 在DC上,如果IT管理員不希望安裝IE11但需要配置Int

Windbg Extension NetExt 使用指南 2 ---- NetExt 的基本命令介紹

摘要 : 本章節介紹NetExt常用的命令. 並且對SOS進行一些對比. NetExt的幫助 要想玩好NetExt, 入門就得看幫助. 看NetExt的幫助可以呼叫!whelp 命令. 這樣hi列舉出NetExt所支援的所有命令. 0:000> !netext.whelp netext ve

Windbg Extension NetExt 使用指南 1 ---- NetExt 介紹

摘要 : 在使用WINDBG做debugging的時候,需要一個好的工具幫助進行資料分析. 最常見的extension包括SOS, PSSCOR.  NetExt則是另外一種提供了豐富命令功能的debugging extension. NetExt主要用於Managed Code的分析功能, 對ASP.NET

Lua 5.3 -- SOL2.0 用戶指南 1

.com 目錄 了解 詳細 rip set 特定 hub 發送 SOL2.2 是一個快速、簡單的C++與LUA的綁定器。如果確定要在你的程序裏面同時運行Lua和C++,SOL 是一個高性能的綁定器,是一個API使用方便的 GO-TO 框架。 簡單看一下特點:這個鏈接到(

手機管理應用研究3—— 垃圾清理篇

dma 系統垃圾 存在 分析 獲得 /dev/ 進行 指定 相互 歡迎轉載。轉載請註明:http://blog.csdn.net/zhgxhuaa 說明 在總篇中提到過垃圾清理,本篇將著重介紹針對緩存、卸載殘留、無用數據等“靜態內容”的清理,有關於系統進程的清理以

js 技巧 (十)廣告JS代碼效果大全 3

lpad log gid cond absolute dex offset ima disable 3.[允許關閉] 與前面兩個代碼不同的是,廣告圖下方增加了一個圖片按紐,允許訪客點擊關閉廣告圖片,下面文本框中就是實現效果所需代碼: var delta=0.015;

VSTO:使用C#開發Excel、Word3

定義 應用程序 導致 編程 生活 成功 員工 無法使用 我們 前言在2002年,Visual Studio .NET和.NET Framework的第一個版本即將完成。我們中的幾個意識到微軟的.NET將會錯過Office,除非我們做了一些事情。 以前曾經是Visual Ba

FindBugs錯誤修改指南

早期 雙重檢查鎖 一點 sub 整理 there chan 調度 又是 FindBugs錯誤修改指南 1. EC_UNRELATED_TYPES Bug: Call to equals() comparing different types Pattern id: EC

Java的基本程序設計結構3

字符常量 signed bsp 表示 rim img sign 字符 enter 數據類型   在Java 中,一共有8 種基本類型(primitive type),其中有4 種整型、2 種浮點類型、1 種用於表示Unicode 編碼的字符單元的字符類型char和1 種用於

nmap使用指南

統計數據 超時 開放端口 嘗試 ip報頭 特定 icm select 否則 一、目標指定 1.CIDR標誌位 192.168.1.0/24 2.指定範圍 192.168.1.1-255 192.168.1-255.1(任意位置)3.IPv6地址只能用規範的IPv6地址或主機

Fiddler抓包3_設置斷點修改

狀態 spa href enter resp ons eth 等於 disabled 1、 斷點修改Request 1.1、Request全部中斷 設置中斷:Rules---> Automatic Breakpoints--->Before Requests 取

DOM案例3密碼強度檢查案例

eight order doc .org 註冊 毫秒 log switch pre <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/

3facebook大數據搜索庫faiss使用——選擇Index

算法 更多 ear with 都是 就是 衡量 k-means聚類 元素 選擇Index並不明顯,有幾個問題可以幫助選擇Index。 是否需要精確結果 使用Flat。 IndexFlat2是唯一能保證精確結果的Index。它為其他Index提供了對比標準。它不會壓縮向量,不

flask第十篇——url_for3

Coding spa deb 什麽 onf media bsp rgs 錯誤 繼續url_for的知識點 # coding: utf-8from flask import Flask, url_forimport flask app = Flask(__name_

flask第十九篇——模板3

方法 base64 spa htm 復制 url emp ati str 請關註微信公眾號:自動化測試實戰 今天我們繼續模板的知識,現在我們增加字典的復雜度,這個時候在render_template第二個參數可以傳**title,以後我們會用**context代替原來的ti

helloworld-微信小程序開發教程-入門篇3

window 學習 視圖 小程序教程 href htm mtv 傳送門 lar 1. 開篇導言 本節目標:通過上一節的講解,相信大家對小程序框架MINA有了初步了解。接下來將會對其進行深入介紹。 目標用戶:無編程經驗,但對微信小程序感興趣的同學。 學習目標:了解M

大眾點評SSM框架3

avi mage cat gif dbeaver 分享圖片 技術分享 info src 【摘要】 因為沒有預置數據,導致項目報錯,DBeaver導入數據(還是Navicat比較好用)。 【導入數據】 【重啟項目】 大眾點評SSM框架【3】

Learing-Python3:Python中的基本運算符

連接 鏈式 優先 bubuko 圖片 比較運算 我只 還需要 其中 一、算數運算 二、比較(關系)運算 比較運算只能在同類型之間進行,其中 int 與 float 同屬於數字類型 三、賦值運算 1、增量賦值    2、鏈式賦值   

Grunt學習筆記3---- filter詳解

add 行處理 class 一個 特殊 col filter詳解 很多 https 本文主要講配置任務中的filter,包括使用默認fs.Stats方法名和自定義過濾函數。 通過設置filter屬性可以實現一些特殊處理邏輯。例如:要清理某個文件夾下的所有空文件夾,這時使用c