Как понять связанные с COM ошибки в многопоточных дампах приложений C ++ - PullRequest
0 голосов
/ 27 июня 2019

Я работаю с набором многопоточных приложений 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.Кто-нибудь может дать мне какое-либо указание, где я должен искать решение, обходной путь, объяснение, ...?

Заранее большое спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...