gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:46:38 28 4
gpt4 key购买 nike

如何在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

回来了,因为没有名字,我还没有想出如何让所有者出来证明我的线程正在等待哪个线程

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

迄今为止我发现的关于该主题的最佳讨论是在 this blog 上,但不幸的是我们最终使用了不同的锁定方法(我最终使用了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

最佳答案

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

1130e410 00f24557 mscorwks!CRWLock::StaticAcquireWriterLockPublic+0xc9

更改为线程 9 并使用 sos.dll 运行 !dso 转储托管的 ReaderWriterLock 对象。然后在 ReaderWriterLock 对象上运行 !do。我相信有一个您可以查询的拥有线程字段。我会测试它看看。

确定这一点的老派方法是运行 ~*e !clrstack 并检查所有等待读写锁的托管线程,然后查看是否可以找到进入相同函数但通过锁的线程(即不同的偏移量)

谢谢,
亚伦

注意:不确定是否有链接帖子的方法,但这与
How do I find the lockholder (reader) of my ReaderWriterLock in windbg

关于windbg - 如何使用windbg从挂起转储中找到句柄所有者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/469993/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com