2014-12-09 72 views
0

看来“!htrace -diff”只能显示16帧。如何增加堆栈轨迹中的帧数?以下是由!htrace -diff检测到的泄漏手柄之一。没有完整的堆栈跟踪,我无法从中读取任何内容。如何在“!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 
+0

有同样的问题。 :( – Boris 2014-12-09 14:42:09

回答

0

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

堆栈跟踪的最大深度是目前硬编码到16 (虽然它可能会在未来改变)。此外,该 包含几个条目,用于堆栈 跟踪的内核模式部分。这些堆栈跟踪条目可以由内核或驱动程序 通过在内核调试器中使用!htrace显示。因此,每个跟踪的11个用户模式条目听起来都很准确。

+0

谢谢,我也读过那篇文章,但是如果htrace无法返回完整的堆栈跟踪,其他方式调试处理泄漏? – 2014-12-10 02:54:28

0

不幸的是,你不能。

假设你有符号设置正确,我看到了以下可能性

一些靠!HTRACE报道的痕迹可能是从不同的进程上下文。在这种情况下,返回地址可能无法在当前进程上下文中正确解析,或者可能解析为错误的符号。

来源:WinDbg的帮助(.hh !htrace

如果一个不同的进程句柄注入到你的进程和地址关联到该进程会发生这种情况。在这种情况下,!htrace列出的进程ID与您正在调试的进程不匹配(输入|(管道)以获取进程ID)。

在这种情况下,您可以附加进程(.attach 0x<pid>,0n默认在此处),并尝试从那里获取剩余的调用堆栈,但我从来没有这样做过。

+0

我的所有作品都在一个进程中。是否有任何其他方式来获取泄漏的手柄没有完整的堆栈跟踪? – 2014-12-10 02:33:28

+0

这样的过程可能是病毒扫描程序或其他程序在系统内部深处。您尝试关闭它们吗? – 2014-12-10 21:49:03

+0

是的,所有的东西都关闭了 – 2014-12-11 10:07:40