Crash Dump Analysis Patterns (Part 127d)
Here we add yet another Technology-Specific Subtrace pattern for COM client calls (as compared to COM interface invocation for servers). We recently got a complete memory dump where we had to find the destination server process, and we used the old technique described in the article In Search of Lost CID. We reprint the 32-bit stack subtrace trace here:
[...]
00faf828 7778c38b ole32!CRpcChannelBuffer::SwitchAptAndDispatchCall+0x112
00faf908 776c0565 ole32!CRpcChannelBuffer::SendReceive2+0xd3
00faf974 776c04fa ole32!CAptRpcChnl::SendReceive+0xab
00faf9c8 77ce247f ole32!CCtxComChnl::SendReceive+0×1a9
00faf9e4 77ce252f RPCRT4!NdrProxySendReceive+0×43
00fafdcc 77ce25a6 RPCRT4!NdrClientCall2+0×206
[...]
Here’s also an x64 fragment from Semantic Structures (PID.TID) pattern:
[...]
00000000`018ce450 000007fe`ffee041b ole32!CRpcChannelBuffer::SwitchAptAndDispatchCall+0xa3
00000000`018ce4f0 000007fe`ffd819c6 ole32!CRpcChannelBuffer::SendReceive2+0×11b
00000000`018ce6b0 000007fe`ffd81928 ole32!CAptRpcChnl::SendReceive+0×52
00000000`018ce780 000007fe`ffedfcf5 ole32!CCtxComChnl::SendReceive+0×68
00000000`018ce830 000007fe`ff56ba3b ole32!NdrExtpProxySendReceive+0×45
00000000`018ce860 000007fe`ffee02d0 RPCRT4!NdrpClientCall3+0×2e2
[...]
If we have the call over ALPC it is easy to find the server process and thread (Wait Chain). In case of a modal loop we can use raw stack analysis technique mentioned above (see also this case study).
Other subtrace examples can be found in pattern examples for High Contention (.NET CLR monitors), Wait Chain (RTL_RESOURCE), and in this case study.
- Dmitry Vostokov @ DumpAnalysis.org + TraceAnalysis.org -
November 28th, 2022 at 8:49 am
Another recent example showing combase instead of ole32:
0:003> kc
# Call Site
00 ntdll!NtAlpcSendWaitReceivePort
01 rpcrt4!LRPC_BASE_CCALL::SendReceive
02 rpcrt4!NdrpSendReceive
03 rpcrt4!NdrpClientCall2
04 rpcrt4!NdrClientCall2
05 combase!BulkUpdateOIDs
06 combase!CRpcResolver::BulkUpdateOIDs
07 combase!CROIDTable::ClientBulkUpdateOIDWithPingServer
08 combase!CROIDTable::ForceImmediateBulkUpdateWithPingServerForAdds
09 combase!CStdMarshal::ConnectCliIPIDEntry
0a combase!CStdMarshal::MakeCliIPIDEntry
0b combase!CStdMarshal::UnmarshalIPID
0c combase!CStdMarshal::UnmarshalObjRef
0d combase!UnmarshalSwitch
0e combase!UnmarshalObjRef
0f combase!CoUnmarshalInterface
10 combase!Ndr64ExtInterfacePointerUnmarshall
11 rpcrt4!Ndr64TopLevelPointerUnmarshall
12 rpcrt4!Ndr64TopLevelPointerUnmarshall
13 rpcrt4!Ndr64pClientUnMarshal
14 rpcrt4!NdrpClientCall3
15 combase!ObjectStublessClient
16 combase!ObjectStubless
17 netprofm!CPubINetwork::GetNetworkConnections
18 winspool!IsNetworkPPP
19 winspool!GetCurrentNetworkIdInternal
1a winspool!GetCurrentNetworkId
1b winspool!InternalGetDefaultPrinter
1c winspool!GetDefaultPrinterW
1d comdlg32!PrintBuildDevNames
1e comdlg32!PrintDlgX
1f comdlg32!PrintDlgW
20 mfc42u!CWinApp::UpdatePrinterSelection
21 mfc42u!CWinApp::GetPrinterDeviceDefaults
22 wordpad!CWordPadApp::CreateDevNames
23 wordpad!CWordPadApp::DoDeferredInitialization
24 mfc42u!_AfxThreadEntry
25 msvcrt!_callthreadstartex
26 msvcrt!_threadstartex
27 kernel32!BaseThreadInitThunk
28 ntdll!RtlUserThreadStart