2015-08-03 78 views
1

我在轉儲文件中得到了以下結果!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 
--------- 
+0

看起來您的應用程序中有未處理的異常。如果它是一個Delphi應用程序,那麼它會拋出一個「Exception-derived object」。我會用'.exr 0x18f558'或'.excr'來檢查調試器。將線程上下文切換到異常拋出點:'.cxr 0x18f5a8' – deemok

+0

嗨@deemok - 再次感謝您的幫助。有什麼方法可以私下與你聯繫嗎? – user884248

+0

你可以使用我的github配置文件中的地址。 – deemok

回答

1

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的「向Microsoft發送錯誤報告」功能後面。

從參數到ntdll!KiUserExceptionDispatcher()這是一個異常記錄和一個異常上下文,您可以瞭解更多關於原始異常的信息。正如@deemok提到的,.exr 0x18f558.cxr 0x18f5a8應該提供更多信息。

從參數到KERNELBASE!RaiseException(),異常代碼是0x0eedfade,這是Delphi應用程序的典型代碼。 Marc Durdin有一篇關於使用WinDbg分析Delphi異常的好帖子。