当使用 windbg 并运行 !dumpheap 命令查看对象的地址时,如何限制特定数量的对象。我发现的唯一方法是在博客http://dotnetdebug.net /2005/07/04/dumpheap-parameters-and-some-general-information-on-sos-help-system 上使用 CTRL+BREAK 和命令行/
-l X - 仅打印每个堆中的 X 个项目,而不是所有对象。
显然 -l 在 SOS.dll 中不再存在
当使用 windbg 并运行 !dumpheap 命令查看对象的地址时,如何限制特定数量的对象。我发现的唯一方法是在博客http://dotnetdebug.net /2005/07/04/dumpheap-parameters-and-some-general-information-on-sos-help-system 上使用 CTRL+BREAK 和命令行/
-l X - 仅打印每个堆中的 X 个项目,而不是所有对象。
显然 -l 在 SOS.dll 中不再存在
你到底在找什么?在查看单个对象之前,通常会缩小感兴趣的区域。
–stat 开关显示堆上对象的每种类型的摘要。
DumpHeap [-stat] [-min ][-max ] [-thinlock] [-mt ] [-type ][start [end]]
start 参数从指定的地址开始列出。end 参数在指定地址停止列出。
参考。
您希望根据哪些标准限制输出数量?-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}} }