19

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

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

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

4

2 回答 2

9

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

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

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

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

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

参考

于 2009-01-31T08:15:21.690 回答
9

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

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

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

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

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

例如,我在大海捞针。我正在一个程序中搜索一个特定的哈希表,堆上有超过 3000 个哈希表。我尝试使用的命令是

.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}} }
于 2010-10-19T21:14:36.523 回答