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

Posted

技术标签:

【中文标题】将 !dumpheap (windbg) 输出限制为 n 个对象【英文标题】:Limit !dumpheap (windbg) output to n objects 【发布时间】:2010-10-04 15:34:53 【问题描述】:

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

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

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

【问题讨论】:

我知道这是一个老问题,但你找到答案了吗? 【参考方案1】:

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

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

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

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

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

Ref.

【讨论】:

我正在寻找单个对象。 -stat -min 100 -max 150 显示 150K+ 小对象。 假设您有 150k 个大小和类型都相同的条目(在我的例子中) - 您到底如何才能找到其中一个的单个地址?如果您打印出完整的列表,那么您注定要在接下来的 30 分钟内中断列表(除了终止进程) 使用cntrl + break,您可以幸运地在输出变得笨拙之前杀死它 我的现代笔记本电脑没有这样的“break”键。哦,进步! (版本 1.2103.01004.0 的 UI 也被锁定,因此按钮和 ctrl+c 都可以工作,但可能对其他人有用)【参考方案2】:

您希望根据哪些标准来限制输出数量? -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 

【讨论】:

对于未来的读者:您应该可以使用-mt,方法表地址为HashTable。您可以通过运行!dumpheap -stat 获取该信息,然后查找HashTable 以获取方法表地址。 @xxbbcc:你是对的。同时我也使用它。更新了答案。 感谢您的更新。您的回答对追踪内存泄漏非常有帮助。

以上是关于将 !dumpheap (windbg) 输出限制为 n 个对象的主要内容,如果未能解决你的问题,请参考以下文章

windbg !heap 输出中的“大小”数字是啥意思?

windbg中“!heap -h”输出中的“内部”是啥意思?

请右击Windbg的DML

WinDbg命令窗口的使用

在WinDBG中高亮你输入的命令

Windbg常用命令系列---!stl