在我的转储文件上有以下!analyze -hang -v
的结果。我看到线程0正在等待一些句柄被释放,如derived_wait_chain
中指定的。我怎样才能得到关于这个句柄的更多信息?!handle 784.183c
返回一个错误…
0:000> !analyze -hang -v
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************
FAULTING_IP:
+0
00000000 ?? ???
EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 00000000
ExceptionCode: 80000007 (Wake debugger)
ExceptionFlags: 00000000
NumberParameters: 0
CONTEXT: 00000000 -- (.cxr 0x0;r)
eax=00000000 ebx=00000000 ecx=00000007 edx=00000000 esi=00000003 edi=00000003
eip=7725ca2c esp=0018edc4 ebp=0018ef4c iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
ntdll!NtWaitForMultipleObjects+0xc:
7725ca2c c21400 ret 14h
BUGCHECK_STR: HANG
PROCESS_NAME: scktsrvr.exe
ERROR_CODE: (NTSTATUS) 0xcfffffff - <Unable to get error code text>
EXCEPTION_CODE: (NTSTATUS) 0xcfffffff - <Unable to get error code text>
NTGLOBALFLAG: 0
APPLICATION_VERIFIER_FLAGS: 0
APP: scktsrvr.exe
ANALYSIS_VERSION: 6.3.9600.17029 (debuggers(dbg).140219-1702) x86fre
DERIVED_WAIT_CHAIN:
Dl Eid Cid WaitType
-- --- ------- --------------------------
0 784.183c Handle
WAIT_CHAIN_COMMAND: ~0s;k;;
BLOCKING_THREAD: 0000183c
DEFAULT_BUCKET_ID: APPLICATION_HANG_HungIn_ExceptionHandler
PRIMARY_PROBLEM_CLASS: APPLICATION_HANG_HungIn_ExceptionHandler
PRIMARY_PROBLEM_CLASS_DATA: .exr 0x18f558 / .cxr 0x18f5a8
LAST_CONTROL_TRANSFER: from 7534112f to 7725ca2c
FAULTING_THREAD: 00000000
STACK_TEXT:
0018edc0 7534112f 00000003 0018ef90 00000001 ntdll!NtWaitForMultipleObjects+0xc
0018ef4c 75817b89 00000003 0018ef90 00000000 KERNELBASE!WaitForMultipleObjectsEx+0xcc
0018ef68 758707bf 00000003 0018ef90 00000000 kernel32!WaitForMultipleObjects+0x19
0018f3a8 75870295 00000000 00000001 00000000 kernel32!WerpReportFaultInternal+0x50b
0018f3b8 75851709 0018f44c 753ef705 0018f45c kernel32!WerpReportFault+0x74
0018f3c0 753ef705 0018f45c 00000001 5931c527 kernel32!BasepReportFault+0x19
0018f44c 00403764 0018f45c 772600b1 0018f558 KERNELBASE!UnhandledExceptionFilter+0x1f4
WARNING: Stack unwind information not available. Following frames may be wrong.
0018f478 77260083 0018f558 0018ff74 0018f5a8 scktsrvr+0x3764
0018f540 772607ff 0018f558 0018f5a8 0018f558 ntdll!ExecuteHandler+0x24
0018f540 75344598 0018f558 0018f5a8 0018f558 ntdll!KiUserExceptionDispatcher+0xf
0018f8e8 0046f881 0eedfade 00000001 00000007 KERNELBASE!RaiseException+0x48
0018fefc 0046f987 0018ff4c 0018ff14 0046fa00 scktsrvr+0x6f881
0018ff4c 0046f502 00470bd4 7ffde000 00470ce3 scktsrvr+0x6f987
0018ff80 75817c04 7ffde000 75817be0 599eeb0a scktsrvr+0x6f502
0018ff94 7727ad1f 7ffde000 5b3cddf8 00000000 kernel32!BaseThreadInitThunk+0x24
0018ffdc 7727acea ffffffff 7726024e 00000000 ntdll!__RtlUserThreadStart+0x2f
0018ffec 00000000 00470bd4 7ffde000 00000000 ntdll!_RtlUserThreadStart+0x1b
FOLLOWUP_IP:
scktsrvr+3764
00403764 83f800 cmp eax,0
SYMBOL_STACK_INDEX: 7
SYMBOL_NAME: scktsrvr+3764
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: scktsrvr
IMAGE_NAME: scktsrvr.exe
DEBUG_FLR_IMAGE_TIMESTAMP: 2a425e19
STACK_COMMAND: ~0s ; kb
BUCKET_ID: HANG_scktsrvr+3764
FAILURE_BUCKET_ID: APPLICATION_HANG_HungIn_ExceptionHandler_cfffffff_scktsrvr.exe!Unknown
ANALYSIS_SOURCE: UM
FAILURE_ID_HASH_STRING: um:application_hang_hungin_exceptionhandler_cfffffff_scktsrvr.exe!unknown
FAILURE_ID_HASH: {45df6cc2-89e8-d20a-efde-b2365e4d9c6c}
Followup: MachineOwner
---------
784
为进程ID (PID), 183c
为线程ID (TID)。为了获得更多关于它正在等待的句柄的信息,切换到线程并获得一个带有参数的调用堆栈(kb
在32位)。这将给你一个对WaitForMultipleObjects()
或WaitForSingleObject()
的调用,从参数中你将获得它等待的句柄。
在您的示例中,堆栈作为!analyze
的一部分列出:
STACK_TEXT:
0018edc0 7534112f 00000003 0018ef90 00000001 ntdll!NtWaitForMultipleObjects+0xc
0018ef4c 75817b89 00000003 0018ef90 00000000 KERNELBASE!WaitForMultipleObjectsEx+0xcc
0018ef68 758707bf 00000003 0018ef90 00000000 kernel32!WaitForMultipleObjects+0x19
看MSDN,它写着
DWORD WINAPI WaitForMultipleObjects(
_In_ DWORD nCount,
_In_ const HANDLE *lpHandles,
_In_ BOOL bWaitAll,
_In_ DWORD dwMilliseconds
);
所以这个线程等待3个句柄,在地址0018ef90
有三个句柄,你可以从!handle
获得更多信息。
然而,似乎真正的问题隐藏在Windows的"向微软发送错误报告"功能后面。
从ntdll!KiUserExceptionDispatcher()
的参数,即异常记录和异常上下文,您可以找到有关原始异常的更多信息。正如@deemok所提到的,.exr 0x18f558
和.cxr 0x18f5a8
应该会带来更多的信息。
从参数到KERNELBASE!RaiseException()
,异常代码是0x0eedfade
,这是典型的Delphi应用程序。Marc Durdin有一篇关于用WinDbg分析Delphi异常的好文章