如何在使用windbg调试时从KERNELBASE!WaitForMultipleObjectsEx的函数中获取句柄

时间:2014-07-19 09:58:52

标签: .net deadlock windbg

我的asp.net应用程序被绞死了。所以我抓了一个转储文件。我发布了一个问题here。 现在在这篇新帖子中,我想找出锁定句柄。

0:177> kb 5
RetAddr           : Args to Child                                                           : Call Site
000007fe`fda11430 : 00000001`012f8bb8 00000000`00000000 000007fe`f1651000 000007fe`f1f00d1f : ntdll!NtWaitForMultipleObjects+0xa
00000000`77851723 : 00000000`0d67b0f8 00000000`0d67b0f0 00000000`00000000 00000000`0d67af50 : KERNELBASE!WaitForMultipleObjectsEx+0xe8
000007fe`fa2f0f15 : 00000000`00000000 00000000`00000000 00000000`0763d720 00000000`00000001 : kernel32!WaitForMultipleObjectsExImplementation+0xb3
000007fe`fa2f0cee : 00000000`00000001 00000000`0763d8e8 00000000`00000001 00000000`0763d8e8 : clr!WaitForMultipleObjectsEx_SO_TOLERANT+0x91
000007fe`fa2f0b79 : 00000000`00000000 00000000`0d67b2c9 00000000`0763d720 00000000`0d67b4c8 : clr!Thread::DoAppropriateAptStateWait+0x56

堆栈跟踪在上面发布。从herehere,我学会了如何尝试找到句柄,但我有一些障碍: 1)kb命令显示前三个参数。但我看到有四个参数被空间分割。

00000000`0d67b0f8 00000000`0d67b0f0 00000000`00000000 00000000`0d67af50

我陷入困境,不知道哪个参数是句柄,哪个参数代表句柄长度。

支持句柄为00000000 0d67b0f0, and the length is 00000000 0d67b0f8。如果我输入

dd 00000000`0d67b0f0 L?00000000`0d67b0f8

这个输出会显示句柄地址吗? 我试着输入命令,但输出太长了。我找不到句柄地址。 我试过了

dd 00000000`0d67b0f0 L1

但是,也找不到手柄。

有人可以帮助我吗? 提前谢谢!

1 个答案:

答案 0 :(得分:1)

length显然不能是000000000d67b0f8,这太过分了。你也在看错了功能。我不知道KERNELBASE!WaitForMultipleObjectsEx的参数是什么或它使用的调用约定,它不是公共API。您需要查看下面的行,该行指的是对kernel32!WaitForMultipleObjectsExImplementation的调用。它的参数看起来更像是WaitForMultipleObjectsEx的参数:第一个参数length是1,这是合理的,下一个是指向句柄数组的指针,其余的是零。因此,您似乎需要在地址HANDLE处转储第一个ULONG_PTR,即000000000763d720