限制!dumpheap(windbg)输出到n个对象

时间:2009-01-31 07:31:52

标签: windbg

使用windbg和running!dumpheap命令查看对象的地址时,如何限制特定数量的对象。我发现的唯一方法是使用CTRL + BREAK 以及博客上的命令行http://dotnetdebug.net/2005/07/04/dumpheap-parameters-and-some-general-information-on-sos-help-system/

-l X - 只打印每个堆中的X个项而不是所有对象。

显然,SOS.dll中不再存在-l

2 个答案:

答案 0 :(得分:6)

你到底在寻找什么?在查看单个对象之前,通常会缩小感兴趣的区域。

-stat开关显示堆上对象的每种类型的摘要。

DumpHeap [-stat] [-min] [ - max] [-thinlock] [-mt] [-type] [start [end]]

  • -stat选项将输出限制为统计类型摘要。
  • -min选项忽略小于size参数的对象,以字节为单位指定。
  • -max选项忽略大于size参数的对象,以字节为单位指定。
  • -thinlock选项报告ThinLocks。有关更多信息,请参阅SyncBlk命令。
  • -mt选项仅列出与指定MethodTable结构对应的对象。
  • -type选项仅列出那些类型名称是指定字符串的子字符串匹配的对象。

start参数从指定的地址开始列出。 end参数停止在指定地址列出。

Ref

答案 1 :(得分:6)

您希望根据哪些标准限制输出数量? -l选项仅根据行号限制输出。这是没用的:假设它只显示前10个对象,也许你要查找的对象甚至没有列出。

如果WinDbgs输出窗口的输出太长,请使用.logopen将对象转储到文件中,然后使用文本编辑器查看该文件。

如果您对对象的外观有其他想法,可以对所有对象执行循环

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

然后使用.if决定您的对象是否符合此条件。

作为一个例子,我在大海捞针寻找针。我在一个程序中搜索特定的Hashtable,堆上有超过3000个Hashtables。我试图使用的命令是

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

1C是哈希表的count成员的偏移量。

100是Hashtable预计至少拥有的项目数。

不幸的是,它不能立即用于Hashtables,因为!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}} }