如何使用windbg从挂起转储中找到句柄所有者?

Osk*_*kar 8 deadlock windbg handle

如何在windbg中找出哪个主题是我的事件句柄的所有者:

我在跑

!handle 00003aec f
Run Code Online (Sandbox Code Playgroud)

得到

Handle 00003aec
  Type          Event
  Attributes    0
  GrantedAccess 0x1f0003:
     Delete,ReadControl,WriteDac,WriteOwner,Synch
     QueryState,ModifyState
  HandleCount   2
  PointerCount  4
  Name          <none>
  No object specific information available
Run Code Online (Sandbox Code Playgroud)

回来了,因为没有名字,我还没弄明白如何让主人出来证明我的线程正在等待哪个线程

[编辑]我必须对转储工作,因为原始进程需要在用户计算机上重新启动,因此无法调试实时会话

到目前为止我发现的关于这个主题的最好的讨论是在这个博客上,但不幸的是我们最终使用了不同的锁方法(我最终使用WaitForMultipleObjectsEx,描述是针对WaitForSingleObject),他似乎可以访问实时进程

我的线程的堆栈跟踪(被阻塞的东西以及我正在寻找当前所有者的那个)是:

0:045> k9
ChildEBP RetAddr 
1130e050 7c90e9ab ntdll!KiFastSystemCallRet
1130e054 7c8094e2 ntdll!ZwWaitForMultipleObjects+0xc
1130e0f0 79ed98fd kernel32!WaitForMultipleObjectsEx+0x12c
1130e158 79ed9889 mscorwks!WaitForMultipleObjectsEx_SO_TOLERANT+0x6f
1130e178 79ed9808 mscorwks!Thread::DoAppropriateAptStateWait+0x3c
1130e1fc 79ed96c4 mscorwks!Thread::DoAppropriateWaitWorker+0x13c
1130e24c 79ed9a62 mscorwks!Thread::DoAppropriateWait+0x40
1130e2a8 79e78944 mscorwks!CLREvent::WaitEx+0xf7
1130e2bc 7a162d84 mscorwks!CLREvent::Wait+0x17
1130e33c 7a02fd94 mscorwks!CRWLock::RWWaitForSingleObject+0x6d
1130e364 79ebd3af mscorwks!CRWLock::StaticAcquireWriterLock+0x12e
1130e410 00f24557 mscorwks!CRWLock::StaticAcquireWriterLockPublic+0xc9
Run Code Online (Sandbox Code Playgroud)

dee*_*mok 0

您可以从内核转储中挖掘它。

现在,就内核调试而言,sysinternals 中的 livekd 应该足够了,但不幸的是它只能在正在运行的系统上使用。

还有一个内核模式内存获取工具,可用于进行转储(代替 Windbg)以供以后检查。

否则,启用句柄跟踪(!htrace -enable)并且(如果代码对于特定线程是唯一的),可以从堆栈跟踪中得出句柄所有权。