将 !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 个对象的主要内容,如果未能解决你的问题,请参考以下文章