限制 !dumpheap (windbg) 输出的对象数量为 n。

19

1
我知道这是一个老问题,但你是否成功找到了答案? - Robot Mess
2个回答

9

你实际上在寻找什么?在查看各个对象之前,通常需要缩小感兴趣的范围。

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

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

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

起始参数从指定地址开始列出。终止参数在指定地址处停止列出。

参考文献


我正在寻找单独的对象。-stat -min 100 -max 150 显示了 150K+ 个小对象。 - Timur Fanshteyn
16
假设您有150k个大小和类型都相同的条目(就像我这里的情况一样),那么您如何找到其中一个条目的单个地址呢?如果您打印出完整的列表,那么您将陷入困境,因为除了杀死进程之外,没有办法在接下来的30分钟内中断列表。 - bitbonk
3
使用 "Ctrl + Break" 组合键,您可以在输出变得难以处理之前将其停止,这可能会让您幸运。 - Antony Thomas
我的现代笔记本电脑没有“中断”键。哦,进步啊!(版本1.2103.01004.0的用户界面也会锁定,因此按钮和ctrl+c无法使用,但对其他人可能有效) - RandomInsano

9

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

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

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

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

然后使用.if来判断您的对象是否符合这些标准。

例如,我正在一堆草堆中寻找针。我正在搜索程序中具有3000个以上哈希表的特定哈希表。我尝试使用的命令是:

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

1C是Hashtable计数成员的偏移量。

100是Hashtable预期至少具有的项目数量。

不幸的是,它并不适用于Hashtables,因为!dumpheap -type还列出了HashtableEnumerators,这些东西会导致调试器崩溃。

要仅转储hashtables,请运行!dumpheap -stat并找出hashtable的方法表,然后使用-mt <methodtable>而不是-type <classname>运行该命令,该命令给出:

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

2
对于未来的读者:您应该能够使用HashTable的方法表地址与-mt一起。您可以通过运行!dumpheap -stat并查找HashTable的方法表地址来获取该信息。 - xxbbcc
@xxbbcc:你说得对。同时我也使用了那个。已更新答案。 - Thomas Weller
谢谢您的更新。您的答案对于追踪内存泄漏非常有帮助。 - xxbbcc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接