在windbg中,如何从!heap -l结果中获取堆头地址?

时间:2010-03-23 20:42:12

标签: windbg

我正在玩windbg的!heap命令,特别是检测内存泄漏的“-l”开关。

当-l确实检测到泄漏时,我遇到了从其结果导航到泄漏源的堆栈跟踪的问题。

以下是!heap -l的结果片段。格式化已更改,以使输出更具可读性。

0:066> !heap -l 在内存中搜索潜在的无法访问的繁忙块。

条目用户堆段
0324b500 0324b508 01580000 03230000
0324b520 0324b528 01580000 03230000

(为简单起见,省略了Size,PrevSize,Unused和Flags列。)

Windbg的!heap文档告诉我将dt _DPH_BLOCK_INFORMATION与标题地址一起使用,然后使用dds与块的StackTrace字段。但是!heap -l的输出没有指定头地址!它仅指定Entry,User,Heap和Segment。我绞尽脑汁看着其他命令,但无法弄清楚如何从这些字段中获取标题地址。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您是否使用AppVerifier或Gflags启用了所需的调试选项?仅当启用了pageheap选项时,内存块才会具有_DPH_BLOCK_INFORMATION,并且如果还启用了该选项,您将能够显示堆栈回溯。要显示块的堆栈跟踪,可以使用!heap -p -a <block address>

请注意!如果在应用程序退出时未使用,堆-l可能会显示大量误报。您也可以尝试使用umdh(也包含在Windows调试工具中)或DebugDiag。