繁体   English   中英

如何从 windows 进程的完整转储中获取句柄信息?

[英]How do I get handles information from a full-dump of a windows process?

我正在尝试调试可能是句柄泄漏的问题。 我在远程 windows 机器上创建了一个转储,我想查看句柄信息。 我正在使用 WinDbg。 我从 MSDN 和其他来源看到了一些文章,例如https://www.codeproject.com/Articles/6988/Debug-Tutorial-Part-5-Handle-Leaks ,但我无法让它工作,所以我需要一些帮助。 我尝试了下一个

  1. Using.handles 或 !devhandles - 这些都失败了。 我要么no export handles found ,要么无法加载 kdexts。 显然 kernel 调试未启用。
  2. 我在我的路径中找到了 winxp/kdexts.dll(给定 from.chain 命令),但它不会加载 - .load kdexts产生 `DebugExtensionInitializeFailed1,错误代码为 0x80004005。
  3. 使用 !handle - 和?handle -? 我得到了命令的帮助,但是当我尝试别的东西时,我得到“无法读取句柄信息”。 例如,
  • !handle - 我希望有完整的句柄列表
  • !handle 0 0
  • !handle 0 0 file

我的设置

  • 远程进程是Windows server 2012 (64bit),和我自己的机器一样
  • 我正在使用来自 windows sdk 10 的最新 WinDbg
  • 我有一个完整的转储,通过右键单击任务管理器创建

如果可能的话,我需要一些帮助

  1. 我是否需要进行内核调试才能从转储中查看句柄列表?
  2. 是否可以对从任务管理器创建的完整转储进行内核调试? 或者是否需要以不同的方式进行转储?
  3. 我如何知道给定的转储文件是否包含句柄信息?
  4. 如何正确使用!handle命令?
  5. 是否有任何其他选择,例如使用 Visual Studio、其他实用程序等?

我会很感激任何帮助!tamir

您的转储可能是没有句柄信息的转储
您可以使用windbg安装附带的dumpchk.exe来查看转储中是否存在Handle Stream
如果您可以控制转储创建检查如何使用.dump / ma with 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

这是在转储中使用和不使用句柄 stream 创建的示例转储

: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                   <

如果您觉得有进取心,请查看这里以获取一些提示,以在没有 windbg /dbgeng 的情况下破译转储

忘记发布在两个转储上执行 !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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM