Remote RPC Call Windows debugging

COM+ Hosting 하는 COM모듈이 제공하는 Method 임의의 Client에서 호출하는 것과 같이 Enterprise Application에서 COM+ mechanism 심심치 않게 이용하는 것은 COM+ 제공하고 있는 확장 , 예를 들면, Object pooling이나 Transaction처리와 같은 기능적 도움을 받는 것이나 심지어 COM 모듈에 문제 발생 도마뱀이 꼬리를 자르는 것처럼 COM+ FailFast 의해 Client와는 상관없이 COM+ surrogate process DLLHOST.exe 죽였다 살리는 life cycling 효과적이기 때문일지도 모른다.

하지만, 임의의 Client에서 COM+ Module 제공하는 Method 호출하는 것은 Out of process Remote RPC call 형태라, 이러한 cross apartment call Marshaling 이라는 Cost effective 성격을 갖고 있는 데다, RPC Call synchronization 성격을 갖고 있어서 호출한 Method blocking 현상 또는 locking 현상이 있을 , 이를 호출한 Client application 역시, waiting 하는 현상을 유발할 있다. 이러한 경우는 Client Application hang 현상이 있다고 하여, 해당 client process Debugging 한다고 해도 문제를 찾아 없으며, RPC Blocking Call 찾아서 이에 target 해당 COM+ module 또는 method 문제여부를 같이 Check해야만 문제를 해결할 있다.

다음은 Remote RPC Call 예이다.

 

0:000> kbL

ChildEBP RetAddr  Args to Child             

0012e898 77480690 77017e09 00000002 0012e8ec ntdll!KiFastSystemCallRet

0012e89c 77017e09 00000002 0012e8ec 00000001 ntdll!ZwWaitForMultipleObjects+0xc

0012e938 75eac4b7 0012e8ec 0012e960 00000000 kernel32!WaitForMultipleObjectsEx+0x11d

0012e98c 760ecec8 00000028 0012e9d4 000003e8 user32!RealMsgWaitForMultipleObjectsEx+0x13c

0012e9b4 760ed001 0012e9d4 000003e8 0012e9e4 ole32!CCliModalLoop::BlockFn+0x97

0012e9dc 761d802c ffffffff 00297b18 069af5bc ole32!ModalLoop+0x5b

0012e9f8 761d9984 00000000 0012eafc 00000000 ole32!ThreadSendReceive+0x12c

0012ea20 761d97f0 0012eae8 05144bf0 0012eb44 ole32!CRpcChannelBuffer::SwitchAptAndDispatchCall+0x194

0012eb00 760ed0a7 05144bf0 0012ecbc 0012ec0c ole32!CRpcChannelBuffer::SendReceive2+0xe7

0012eb1c 760ed059 0012ecbc 0012ec0c 05144bf0 ole32!CCliModalLoop::SendReceive+0x1e

0012eb94 76104bdb 05144bf0 0012ecbc 0012ec0c ole32!CAptRpcChnl::SendReceive+0x73

0012ebe8 762b1c88 05144bf0 0012ecbc 0012ec0c ole32!CCtxComChnl::SendReceive+0x1c5

0012ec00 762b1c3f 0697e43c 0012ed14 762b1e10 rpcrt4!NdrProxySendReceive+0x43

0012ec0c 762b1e10 c7185166 0012f130 070001f3 rpcrt4!NdrpProxySendReceive+0xc

0012f0f4 762b1c1c 760f82f0 760ff104 0012f130 rpcrt4!NdrClientCall2+0xbde

0012f118 762336e3 0012f130 00000003 0012f16c rpcrt4!ObjectStublessClient+0x6f

0012f128 761cfc88 0697e43c 000416cc 0026e788 rpcrt4!ObjectStubless+0xf

0012f16c 761a1bea 000416cc 00000004 0026e788 ole32!PrivDragDrop+0xa3

0012f1d4 761a1a56 0688c820 029e3300 00000000 ole32!CDropTarget::Drop+0x4e

0012f1fc 761a2478 0012f294 029e3300 029e3300 ole32!CDragOperation::CompleteDrop+0x5a

 

0:000> dd 05144bf0+18 l1

05144c08  050d8d20

 

0:000> dd 050d8d20+8 l2

050d8d28  000011b4 00001a7c <------ 11b4(PID), 1a7c(TID)

**

** 해당 PID TID 해당하는 Thread Check하여 Blocking Issue 확인해야


핑백

덧글

댓글 입력 영역