Я работаю с набором многопоточных приложений C ++, взаимодействующих через интерфейс COM.В настоящее время кажется, что одно из моих приложений зависает, и я не знаю, как действовать.
Я попросил клиента взять полный дамп памяти зависшего приложения, и при открытии его в Windbg, *Команда 1003 * упоминает, что некоторые потоки (b) блокируют выполнение других потоков.
Такой (b) блокирующий поток имеет следующий стек вызовов:
Not Flagged > 8958 0 Worker Thread ntdll.dll!TppWorkerThread [Inline Frame] combase.dll!CRpcChannelBuffer::ServerGetBuffer
ntdll.dll!NtAlpcCreateSectionView()
rpcrt4.dll!AlpcAllocateView(void *,unsigned __int64,void *,void * *,unsigned __int64 *)
rpcrt4.dll!PrepareSectionForUse(class LRPC_CACHED_SECTION *,void *,void * *)
rpcrt4.dll!LRPC_SECTION_CACHE::PrepareSectionForUse(class LRPC_CACHED_SECTION *,class SectionReadyForUseInfo *,void * *)
rpcrt4.dll!LRPC_SECTION_CACHE::GetSectionAndView(unsigned __int64,int (*)(class LRPC_CACHED_SECTION *,void *,void * *),void *,struct _CLIENT_ID,void * *,void * *,unsigned __int64 *)
rpcrt4.dll!LRPC_SASSOCIATION::AlpcAllocateSectionAndView(unsigned __int64,struct _CLIENT_ID,void * *,void * *,unsigned __int64 *)
rpcrt4.dll!LRPC_SCALL::GetBuffer(struct _RPC_MESSAGE *,struct _GUID *)
rpcrt4.dll!I_RpcGetBufferWithObject()
[Inline Frame] combase.dll!CRpcChannelBuffer::ServerGetBuffer(tagRPCOLEMESSAGE *) Line 3769
[Inline Frame] combase.dll!CRpcChannelBuffer::GetBuffer(tagRPCOLEMESSAGE *) Line 2720
[Inline Frame] combase.dll!CAptRpcChnl::GetBuffer(tagRPCOLEMESSAGE *) Line 637
combase.dll!CCtxComChnl::GetBuffer(tagRPCOLEMESSAGE * pMessage=0x0000008cd187f3e8, const _GUID & riid={...}) Line 555
combase.dll!NdrExtStubGetBuffer(void * pvThis, void * pvChannel=0x0000008a3d7e72e8, _MIDL_STUB_MESSAGE * pStubMsg=0x000000905287e0b0) Line 1953
rpcrt4.dll!NdrStubCall2()
rpcrt4.dll!NdrStubCall3()
combase.dll!CStdStubBuffer_Invoke(IRpcStubBuffer * This, tagRPCOLEMESSAGE * prpcmsg, IRpcChannelBuffer * pRpcChannelBuffer) Line 1507
combase.dll!SyncStubInvoke(tagRPCOLEMESSAGE * pMsg, const _GUID & riid, CIDObject * pID, void * pVtableAddress, IRpcChannelBuffer * pChnl, IRpcStubBuffer * pStub, void * pInterface, unsigned long * pdwFault) Line 1664
[Inline Frame] combase.dll!StubInvoke(tagRPCOLEMESSAGE * pMsg=0x0000008cd187f3e8, CStdIdentity *) Line 1957
combase.dll!CCtxComChnl::ContextInvoke(tagRPCOLEMESSAGE * pMessage=0x0000008cd187f3e8, IRpcStubBuffer * pStub=0x0000008a3d7e5290, tagIPIDEntry * pIPIDEntry=0x0000008a3d7e7840, unsigned long * pdwFault=0x000000905287ed00) Line 1377
[Inline Frame] combase.dll!DefaultInvokeInApartment(tagRPCOLEMESSAGE *) Line 2716
combase.dll!AppInvoke(CMessageCall * pCall=0x0000008cd187f340, CRpcChannelBuffer * pChannel=0x0000008a3d7e72e8, IRpcStubBuffer * pStub=0x0000008a3d7e5290, void * pv, void * pStubBuffer=0x0000008e8cfda1f8, tagIPIDEntry * pIPIDEntry=0x0000008a3d7e7840, WireLocalThis * pLocalb=0x0000008e8cfda1e8) Line 1481
combase.dll!ComInvokeWithLockAndIPID(CMessageCall * pCall, tagIPIDEntry * pIPIDEntry) Line 2313
combase.dll!ThreadInvoke(_RPC_MESSAGE * pMessage=0x0000008a465355b0) Line 5539
rpcrt4.dll!DispatchToStubInCNoAvrf()
rpcrt4.dll!RPC_INTERFACE::DispatchToStubWorker(struct _RPC_MESSAGE *,unsigned int,int,long *)
rpcrt4.dll!LRPC_SCALL::DispatchRequest(int *)
rpcrt4.dll!LRPC_SCALL::HandleRequest(struct _PORT_MESSAGE *,struct _PORT_MESSAGE *,void *,unsigned __int64)
rpcrt4.dll!LRPC_SASSOCIATION::HandleRequest(struct _PORT_MESSAGE *,struct _PORT_MESSAGE *,void *,unsigned __int64,int,class RPCP_ALPC_TOKEN_ATTR *,class RPCP_ALPC_HANDLE_ATTR *)
rpcrt4.dll!LRPC_ADDRESS::ProcessIO(void *)
rpcrt4.dll!LrpcIoComplete(struct _TP_CALLBACK_INSTANCE *,void *,struct _TP_ALPC *,void *)
ntdll.dll!TppAlpcpExecuteCallback()
ntdll.dll!TppWorkerThread()
kernel32.dll!BaseThreadInitThunk()
ntdll.dll!RtlUserThreadStart()
Все остальные (b)блокирующие потоки имеют аналогичный стек вызовов, но, похоже, существуют другие потоки, выполняющие NtAlpcCreateSectionView()
без (b) блокировки выполнения программы.
Я не имею представления о внутренних компонентах COM.Кто-нибудь может дать мне какое-либо указание, где я должен искать решение, обходной путь, объяснение, ...?
Заранее большое спасибо