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

如何使用windbg从挂起转储中找到句柄所有者?,windbg,deadlock,handle,Windbg,Deadlock,Handle,如何确定哪个线程是windbg中事件句柄的所有者: 我在跑步 !handle 00003aec f 得到 Handle 00003aec Type Event Attributes 0 GrantedAccess 0x1f0003: Delete,ReadControl,WriteDac,WriteOwner,Synch QueryState,ModifyState HandleCount 2 PointerCount 4

如何确定哪个线程是windbg中事件句柄的所有者:

我在跑步

!handle 00003aec f
得到

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

您可以从内核转储中挖掘它。 现在,就内核调试而言,来自sysinternals的livekd应该足够了,但不幸的是,它只能在运行的系统上使用。 还有一种内核模式,可以用来获取转储(代替windbg)供以后检查。
否则,启用句柄跟踪(!htrace-enable)和(如果特定线程的代码是唯一的),则可以从堆栈跟踪中推断句柄所有权。

查看调用堆栈,似乎有问题的堆栈正在使用ReaderWriterLock锁定机制

1130e410 00f24557 mscorwks!CRWLock::StaticAcquireWriterLockPublic+0xc9
切换到线程9并使用sos.dll运行!dso转储托管ReaderWriterLock对象。那就跑!在ReaderWriterLock对象上执行该操作。我相信您可以查询一个拥有线程的字段。我会试试看。 决定这一点的老派方法是运行~*e!clrstack并检查等待readerwriter锁的所有托管线程,然后查看是否可以找到已进入相同函数但已通过锁(即不同偏移量)的线程 谢谢 亚伦

注意:不确定是否有链接帖子的方法,但此方法与

使用
!htrace
命令获取线程ID。您必须首先(可能在程序开始时)使用
启用跟踪收集!htrace-启用

0:001> !htrace 00003aec -------------------------------------- Handle = 0x00003aec - OPEN Thread ID = 0x00000b48, Process ID = 0x000011e8 ... 0:001> !htrace 00003aec -------------------------------------- 句柄=0x00003aec-打开 线程ID=0x00000b48,进程ID=0x000011e8 ... 上面的输出是虚构的,它将与您的系统不同。但它将为您提供所需的信息—线程ID(在我的示例中为0x00000b48)

我必须在一个垃圾场工作 原始进程需要重新启动 在用户计算机上,因此无法调试 现场会议

我不是100%确定,但我认为这会起作用:

  • 连接到进程并运行
    !htrace-启用
  • 使用
    qd
    从流程中分离。可执行文件将继续
  • 您现在可以获取一个转储文件并使用上面的命令-我认为您将获得所描述的结果

  • 这是我找到的确切答案。我从来没有试过。不过,您需要实时调试来确定所有者。但是很快。

    我不能用!当我需要从用户的机器上抓取转储时,启用(或者快速重启,以便他继续他的工作),否则看起来很有意思。你能描述一下你的应用程序在做什么吗?(我拿它.net,但是我不确定你是如何开发的)——C++或使用托管C++扩展?),并且请提供栈前3个ARG(KB)。并且可能提供关于线程到底在(应该)做什么的洞察?我没有看到来自的锁所有者!dso,并且在所有其他线程上执行clrstack不会显示谁拥有锁,因为拥有该锁的线程不太可能仍在运行锁定语句(它已经拥有锁并且正在某处执行实际工作,或者在另一个锁上也被阻塞了)。OP需要这个来进行挂起转储,因此在这种情况下这几乎没有用处。 0:001> !htrace 00003aec -------------------------------------- Handle = 0x00003aec - OPEN Thread ID = 0x00000b48, Process ID = 0x000011e8 ...