如何在“!htrace -diff”结果中获取所有帧堆栈跟踪?

时间:2014-12-09 12:54:05

标签: memory-leaks windbg handle-leak

似乎“!htrace -diff”只能显示16帧。如何增加堆栈跟踪中的帧数?以下是!htrace -diff检测到的泄漏句柄之一。没有完整的堆栈跟踪,我无法从中读取任何内容。

Handle = 0x00000f7c - OPEN
Thread ID = 0x00001cc4, Process ID = 0x00009f20

0x01b8dad8: +0x01b8dad8
0x018c6e93: +0x018c6e93
0x7788179a: +0x7788179a
0x000a20bb: +0x000a20bb
0x753ab069: +0x753ab069
0x7539cf87: +0x7539cf87
0x75322776: +0x75322776
0x7539d07e: +0x7539d07e
0x7539c549: +0x7539c549
0x778ae707: +0x778ae707
0x7785c32e: +0x7785c32e
0x77a2ff66: ntdll!ZwCreateEvent+0x00000012
0x69bffc58: verifier!AVrfpNtCreateEvent+0x0000006b
0x77390d93: KERNELBASE!CreateEventExW+0x0000006e
0x773911c6: KERNELBASE!CreateEventW+0x00000027
0x69bffd8f: verifier!AVrfpCreateEventW+0x00000078

2 个答案:

答案 0 :(得分:0)

This link指向this one这说明基本上它是硬编码的。

  

堆栈跟踪的最大深度当前硬编码为16   (虽然它有可能在未来发生变化)。还有那个   包括堆栈的内核模式部分的一些条目   跟踪。这些堆栈跟踪条目可以由内核或驱动程序显示   开发人员在内核调试器中使用!htrace。所以到处走走   每条跟踪的11个用户模式条目听起来很准确。

答案 1 :(得分:0)

很遗憾,你不能。

假设您已正确设置符号,我会看到以下可能性

  

!htrace报告的一些跟踪可能来自不同的进程上下文。在这种情况下,返回地址可能无法在当前进程上下文中正确解析,或者可能会解析为错误的符号。

来源:WinDbg帮助(.hh !htrace

如果其他进程将句柄注入您的进程并且地址与该进程相关,则会发生这种情况。在这种情况下,!htrace列出的进程ID与您正在调试的进程(类型|(管道)不匹配以获取进程ID)。

在这种情况下,您可以附加到流程(.attach 0x<pid>,此处0n是默认值)并尝试从那里获取剩余的callstack,但我自己从未这样做过。