2009-01-31 71 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}} }