2009-01-31 106 views
14

使用windbg和running!dumpheap命令查看對象的地址時,如何限制到特定數量的對象。我發現的唯一方法是使用CTRL + BREAK 和博客上的命令行http://dotnetdebug.net/2005/07/04/dumpheap-parameters-and-some-general-information-on-sos-help-system/Limit!dumpheap(windbg)輸出到n個對象

-l X - 僅打印出每個堆中的X個項目,而不是所有對象。

顯然-l不再存在於SOS.dll中

+1

我知道這是一個老問題上運行的命令,但你設法找出答案? – 2015-09-28 07:22:14

回答

5

你在找什麼?在查看單個物體之前,通常要縮小感興趣的區域。

-stat開關顯示堆中每個對象類型的摘要。

DumpHeap [-stat] [-min] [ - 最大] [-thinlock] [-mt] [型] [開始[END]]

  • 的-stat選項將輸出限制到統計類型摘要。
  • -min選項忽略小於大小參數的對象,以字節指定。
  • -max選項忽略大於大小參數的對象,以字節爲單位指定。
  • -thinlock選項報告ThinLocks。有關更多信息,請參閱SyncBlk命令。
  • -mt選項僅列出與指定MethodTable結構相對應的那些對象。
  • -type選項僅列出那些類型名稱與指定字符串匹配的子字符串的對象。

start參數從指定地址開始列表。結束參數停止在指定地址列出。

Ref

+0

我正在尋找個別物件。 -stat -min 100 -max 150顯示我150K +小物件。 – 2009-01-31 15:18:17

+9

假設你有150k條目都是相同的大小和類型(和我的情況一樣) - 你怎麼能找出其中一個地址的單個地址?如果你打印出完整的清單,你就會注意到,現在有辦法在接下來的30分鐘內中斷清單(除了殺死進程) – bitbonk 2009-09-22 20:15:07

6

根據哪個標準限制輸出數量? -l選項只是根據行號限制輸出。這是沒用的:假設它只顯示前10個對象,可能您要查找的對象甚至沒有列出。

如果WinDbgs輸出窗口的輸出太長,請使用.logopen將對象轉儲到文件中,然後使用文本編輯器查看該文件。

如果您有其他的想法你的對象的樣子,你可以在所有對象

.foreach (obj { !dumpheap -short -type MyType}) 

,然後用.if決定你的對象是否不符合此條件進行循環。

作爲一個例子,我在乾草堆裏尋找一根針。我在堆上搜索超過3000個Hashtables的程序中的特定Hashtable。我嘗試使用的命令是

.foreach (obj { !dumpheap -short -type Hashtable }) {.if (poi(poi(${obj}+1c)) > 100) {!do ${obj}} } 

1C在哈希表的計數部件的偏移量。

100是Hashtable預計將至少有項目的數量。

不幸的是,它不能立即用於哈希表,因爲!dumpheap -type也列出了HashtableEnumerators,它以某種方式崩潰了調試器。

要只轉儲哈希表,運行!dumpheap -stat並找出哈希表的方法表,並與-mt <methodtable>代替-type <classname>,這給

.foreach (obj { !dumpheap -short -mt <MT of Hashtable> }) {.if (poi(poi(${obj}+1c)) > 100) {!do ${obj}} }