!htrace只显示14个callstack帧(callstack太短)



我尝试使用!htrace来检测一些句柄泄漏(我在gflags用户模式callstack中启用之前)问题是,尽管它显示了句柄分配的调用堆栈,但它们的大小被限制为14帧。Windbg命令"kframes biggerLimit"没有帮助。

你说只有14帧是什么意思?
在你启用htrace之后你做了足够的操作吗?
据我所知没有14帧的限制
只是为了确认我将CDB附加到一个正在运行的notepad++实例并记录了跟踪

cdb -pn notepad++
!启用
。Logopen d:htrace.txt
g
打开关闭几个选项卡,关于插件等可能收集的
用ctrl+c
做了!htrace并退出和awk grepped了htrace.txt

我可以看到很多痕迹和框架>1.61 MB大的日志几分钟

:>ls -lag *.txt
-rw-r--r-- 1 197121 1691957 Oct 19 23:01 htrace.txt
:>awk "/Handle = /" htrace.txt | tail
Handle = 0x0000000000000484 - CLOSE
Handle = 0x0000000000000484 - OPEN
Handle = 0x0000000000000480 - CLOSE
Handle = 0x0000000000000480 - OPEN
Handle = 0x000000000000047c - CLOSE
Handle = 0x000000000000047c - OPEN
Handle = 0x0000000000000478 - CLOSE
Handle = 0x0000000000000478 - OPEN
Handle = 0x0000000000000474 - CLOSE
Handle = 0x0000000000000474 - OPEN
:>grep -iE "parse|dump" htrace.txt
Parsed 0x56C stack traces.
Dumped 0x56C stack traces.
:>awk "/Handle =/{print NR-1;NR=0}" htrace.txt | sort | uniq
13
14
15
16
17
18 <<<<<<<<<<<<<
3
:>

一个这样的跟踪包含15帧如下

Handle = 0x00000000000004a0 - CLOSE
Thread ID = 0x0000000000002488, Process ID = 0x0000000000000644
0x00007ffa5769d084: ntdll!NtClose+0x0000000000000014
0x00007ffa54fe3c56: KERNELBASE!RegCloseKey+0x00000000000000b6
0x00007ffa566e48d3: shcore!CRegistrySource::Release+0x0000000000000043
0x00007ffa54962773: windows_storage!CProgidArray::EnumerateCapableFileHandlers+0x00000000000001d3
0x00007ffa54961ce6: windows_storage!CAssocProgidElement::_GetUserChoice+0x0000000000000082
0x00007ffa549629ac: windows_storage!CAssocProgidElement::_MapExtensionToUserDefault+0x0000000000000204
0x00007ffa54962206: windows_storage!CAssocProgidElement::_InitSource+0x0000000000000066
0x00007ffa5496d6ac: windows_storage!CAssocShellElement::SetKey+0x000000000000005c
0x00007ffa5495a957: windows_storage!AssocElemCreateForClass2+0x0000000000000083
0x00007ffa5495a6d1: windows_storage!CFileAssocList::CreateAssoc+0x00000000000000d1
0x00007ffa5493e17f: windows_storage!CAssocListBase::_GetOrCreate+0x000000000000006f
0x00007ffa5495e773: windows_storage!CAssocListBase::GetAssoc+0x00000000000000a7
0x00007ffa5495e657: windows_storage!CFileAssocList::_IsLink+0x0000000000000043
0x00007ffa5495e5bb: windows_storage!CFileAssocList::GetAssocTable+0x000000000000001b
0x00007ffa5495ebde: windows_storage!CAssocListBase::EnumerateElements+0x00000000000000de
--------------------------------------
Handle = 0x00000000000004a0 - OPEN

它似乎是一个硬编码的最大16帧根据现在消失的帖子从ertwhile windbg MSDN新闻组引用引号

的副本

丹米海[MSFT]"dmihai@xxxxxxxxxxxxxxxxxxxx留言中写道新闻:% 23 ngssnsngha.4604@xxxxxxxxxxxxxxxxxxxxxxx

小修正:操作系统内核捕获了!htrace堆栈跟踪(不是ntdll)。最重要的是这些的顺序痕迹是"完全准确的"。例如,如果进程A正在关闭一个句柄在进程B内(使用DuplicateHandle),并启用句柄跟踪B,您将获得跨进程CLOSE操作的日志条目。如果堆栈跟踪将在用户模式下实现(例如在ntdll中),进程B的ntdll不会得到"通知"。关于跨进程CLOSEB的句柄会在htrace日志中没有任何记录。那将减少!htrace.

的值。堆栈跟踪的最大深度目前硬编码为16(尽管将来可能会有所改变)。这还包括堆栈跟踪的内核模式部分有几个条目。这些堆栈内核或驱动程序开发人员可以使用!htrace在内核调试器中。得到大约11个用户模式条目你的每条线索听起来都很准确。

内核目前不允许非常深的堆栈跟踪,因为跟踪数组存储在非分页池中,这是一个非常昂贵的系统资源。