如何解决如何从 Windows 进程的完整转储中获取句柄信息?
我正在尝试调试可能是句柄泄漏的问题。我在远程 Windows 机器上创建了一个转储,我想查看句柄信息。我正在使用 WinDbg。我看过来自 MSDN 和其他来源的一些文章,比如 https://www.codeproject.com/Articles/6988/Debug-Tutorial-Part-5-Handle-Leaks,但我无法让它工作,所以我需要一些帮助。 我试了下
- 使用 !handles 或 !devhandles - 这些都失败了。我要么得到
no export handles found
,要么无法加载 kdext。显然未启用内核调试。 - 我在我的路径中找到了 winxp/kdexts.dll(由 .chain 命令提供),但它无法加载 -
.load kdexts
生成 `DebugExtensionInitializeFailed1,错误代码为 0x80004005。 - 使用 !handle - 和
!handle -?
我得到命令的帮助,但是当我尝试其他操作时,我得到“无法读取句柄信息”。例如,
-
!handle
- 我需要一个完整的句柄列表 !handle 0 0
!handle 0 0 file
我的设置
- 远程进程是Windows server 2012(64位),就像我自己的机器
- 我使用的是来自 windows sdk 10 的最新 WinDbg
- 我有一个完整的转储,通过右键单击任务管理器创建
如果可能的话,我需要一些帮助
- 是否需要进行内核调试才能查看转储中的句柄列表?
- 是否可以对从任务管理器创建的完整转储进行内核调试?或者是否需要以不同的方式进行转储?
- 如何知道给定的转储文件是否包含句柄信息?
- 如何正确使用
!handle
命令? - 是否还有其他替代方法,例如使用 Visual Studio、其他实用程序等?
我很感激任何帮助 !tamir
解决方法
你的转储可能是一个没有处理信息的转储
可以使用windbg安装自带的dumpchk.exe查看dump中是否存在Handle Stream
如果您可以控制转储创建,请检查如何将 .dump /ma 与 windbg 一起使用
或者你也可以探索 sysinternals procdump.exe
并确保您对有问题的转储使用正确的位调试器
示例路径
D:\>dir /s /b "c:\Program Files (x86)\Windows Kits\10\Debuggers\cdb.exe"
c:\Program Files (x86)\Windows Kits\10\Debuggers\arm\cdb.exe
c:\Program Files (x86)\Windows Kits\10\Debuggers\arm64\cdb.exe
c:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe
c:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe
这是在转储中有和没有句柄流的示例转储创建
:000> .dump /ma d:\madump.dmp
Creating d:\madump.dmp - mini user dump
Dump successfully written
0:000> .dump d:\nomadump.dmp
Creating d:\nomadump.dmp - mini user dump
Dump successfully written
0:000> q
使用 dumpchk 分析转储并检查是否存在流
dumpchk nomadump.dmp > nomachk.txt
dumpchk madump.dmp > machk.txt
D:\>type machk.txt |grep -i number.*stream
NumberOfStreams 17
D:\>type nomachk.txt |grep -i number.*stream
NumberOfStreams 13
差异
D:\>diff -y machk.txt nomachk.txt
Microsoft (R) Windows Debugger Version 10.0.17763.132 AMD64 Microsoft (R) Windows Debugger Version 10.0.17763.132 AMD64
Loading Dump File [D:\madump.dmp] | Loading Dump File [D:\nomadump.dmp]
User Mini Dump File with Full Memory: Only application d | User Mini Dump File: Only registers,stack and portions of me
----- User Mini Dump Analysis ----- User Mini Dump Analysis
MINIDUMP_HEADER: MINIDUMP_HEADER:
Version A793 (A063) Version A793 (A063)
NumberOfStreams 17 | NumberOfStreams 13
Flags 441826 | Flags 40000
0002 MiniDumpWithFullMemory <
0004 MiniDumpWithHandleData <
0020 MiniDumpWithUnloadedModules <
0800 MiniDumpWithFullMemoryInfo <
1000 MiniDumpWithThreadInfo <
40000 MiniDumpWithTokenInformation 40000 MiniDumpWithTokenInformation
400000 MiniDumpWithIptTrace <
忘记发布对两个转储执行 !handle 的结果
D:\>cdb -c "!handle;q" -z nomadump.dmp |awk /Reading/,/quit/"
0:000> cdb: Reading initial command '!handle;q'
ERROR: !handle: extension exception 0x80004002.
"Unable to read handle information"
quit:
D:\>cdb -c "!handle;q" -z madump.dmp |awk /Reading/,/quit/"
0:000> cdb: Reading initial command '!handle;q'
Handle 0000000000000004
Type File
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxSNIPxxxxxxxxx
Handle 0000000000000128
Type Mutant
Handle 000000000000012c
Type
Handle 0000000000000180
Type File
70 Handles
Type Count
None 27
Event 13
File 8
Directory 2
Mutant 1
Semaphore 2
Key 6
IoCompletion 2
TpWorkerFactory 2
ALPC Port 1
WaitCompletionPacket 6
quit:
,
检查用于创建故障转储的工具。也许它提供了包含句柄数据的选项。
-
任务管理器默认包含句柄数据
-
Visual Studio 默认包含句柄数据
-
在 WinDbg 中,
.dump
可以与/mh
开关一起使用以包含句柄数据。/ma
是/mfFhut
的快捷方式,因此它还包含句柄数据。 -
ProcDump 自动包含句柄数据。
-
Windows 错误报告 LocalDumps 可以使用名为
CustomDumpFlags
的注册表值进行配置。 -
如果您自己使用
MiniDumpWriteDump()
以编程方式创建转储,请使用MINIDUMP_TYPE
::MiniDumpWithHandleData
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。