【问题标题】:Getting handles data with MiniDump (DbgHelp.h)使用 MiniDump (DbgHelp.h) 获取句柄数据
【发布时间】:2016-02-06 14:23:36
【问题描述】:

我正在努力通过 Minidump (DbgHelp.h) 获取句柄信息。

我正在从映射文件流中获取MINIDUMP_HANDLE_DESCRIPTOR_2 的列表.. 然后我通过使用ObjectInfoRva 字段为每个描述符获取一个MINIDUMP_HANDLE_OBJECT_INFORMATION

但是我无法理解这个MINIDUMP_HANDLE_OBJECT_INFORMATION 结构给了我什么信息,我在网上找不到任何从MINIDUMP_HANDLE_OBJECT_INFORMATION 中提取有意义信息的示例,而且文档也不是很有帮助。

如何使用MINIDUMP_HANDLE_OBJECT_INFORMATION 结构数据来获取人类可读的数据?我的意思是我需要用它做什么? 我总是在 InfoType 归档时得到 0,这意味着 - MiniHandleObjectInformationNone

MINIDUMP_HANDLE_OBJECT_INFORMATION 结构:

public struct MINIDUMP_HANDLE_OBJECT_INFORMATION
{
    public uint NextInfoRva;
    public MINIDUMP_HANDLE_OBJECT_INFORMATION_TYPE InfoType;
    public UInt32 SizeOfInfo;
}

我用 MINIDUMP_HANDLE_OBJECT_INFORMATION 结构做了一些实验

当我得到结构时,我能够从 RVA 地址读取一个大小为SizeOfInfo 的字符串。在这里,我将'Directory'作为字符串获取到我得到的所有句柄描述符上......

文档链接:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms680375(v=vs.85).aspx

任何帮助将不胜感激:)

我尝试应用它的过程使用WaitForMultipleObjectsWaitForSingleObject Kernel32 调用。

链接到我的实现:

https://github.com/Pavel-Durov/Multithreading-Debugging-Asignments/blob/master/Assignments/Assignments.Core/Handlers/MiniDumpHandler.cs

链接到 WinDbg !handle 我在同一个转储文件上执行的命令输出: https://docs.google.com/document/d/1Hjid-2dcM0aZrg5A1p5VrCBSysU_VQhynXdBAvXV29Q/edit?usp=sharing

也许问题是我没有为我的 MINIDUMP_HANDLE_OBJECT_INFORMATION_TYPE 枚举设置有效值,有没有人熟悉这个枚举值声明的可靠来源?我没有找到任何官方的。

只是为了说清楚。

在 WinDbj 中,我获得的信息与从 MINIDUMP_HANDLE_DESCRIPTOR_2 获得的信息相同, 例如,如果 WinDbg !handle 命令具有以下输出:

Handle 00000004
  Type                   Directory
Handle 00000008
  Type                   Directory
Handle 0000000c
  Type                   Event
Handle 00000010
  Type                   Event
Handle 00000014
  Type                   File
…

我可以从MINIDUMP_HANDLE_DESCRIPTOR_2 ObjectName 和 TypeName 中得到相同的数据,它们都是MINIDUMP_STRING 类型。

无法获得的信息是位于MINIDUMP_HANDLE_OBJECT_INFORMATION 结构中的信息。这在!hanlde 命令输出中不可见。

假设什么样的信息位于MINIDUMP_HANDLE_OBJECT_INFORMATION 中?

【问题讨论】:

  • 最可能的原因是记录在案的原因,您在此过程中根本没有任何有趣的句柄。您只能获得有关线程、进程和互斥体句柄的额外信息。其余的都是“没有额外信息”,0。
  • 我正在收集有关等待多个互斥锁的进程的此信息,如果我使用 ClrMd 查看进程,我会得到互斥锁名称...跨度>
  • 托管 Mutex 对象与非托管对象无关。此表是为了调试器的好处,使用 Windbg !handle 命令进行比较。
  • 哦,对了,我试试,谢谢!
  • 我已经在 Kernel32 调用(更新了问题)上对其进行了测试,但我在每个句柄信息上都得到 MiniHandleObjectInformationNone

标签: c# windows handle minidump dbghelp


【解决方案1】:

经过几个小时的磨难——调试我的托管代码并将其与 C++ 代码示例进行比较——我发现了 MINIDUMP_HANDLE_OBJECT_INFORMATION 结构读取的错误——我没有正确计算 rva + baseMinidump 地址。

现在可以了,我可以获取句柄的附加信息:)

Mu 代码可以在这里找到: https://github.com/Pavel-Durov/Multithreading-Debugging-Asignments/blob/master/Assignments/Assignments.Core/Handlers/MiniDumpHandler.cs

第 144 行,DealWithHandleInfo 函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    相关资源
    最近更新 更多