RPC 需要其背景工作線程才能正常執行。 常見的問題是,同一進程中的不同元件會在佔用其中一個全域性關鍵區段時死結(例如載入器鎖定或堆積鎖定)。 這會導致許多執行緒卡住——非常可能包括一些 RPC 工作者執行緒。
如果發生這種情況,RPC 伺服器將不會回應外部世界。 對它的 RPC 呼叫會傳回RPC_S_SERVER_UNAVAILABLE或RPC_S_SERVER_TOO_BUSY。
如果錯誤驅動程式導致 IRP 無法完成並到達 RPC 伺服器,則類似的問題可能會造成。
如果您懷疑其中一個問題可能發生,請使用 DbgRpc 搭配 -t 參數(或使用 !rpcexts.getthreadinfo 擴充功能)。 進程標識碼應當做參數使用。 在下列範例中,假設進程標識碼是0xC4:
D:\wmsg>dbgrpc -t -P c4
Searching for thread info ...
## PID CELL ID ST TID LASTTIME
-----------------------------------
00c4 0000.0004 03 0000011c 000f164f
00c4 0000.0007 03 00000120 008a6290
00c4 0000.0015 03 0000018c 008a6236
00c4 0000.0026 03 00000264 0005c443
00c4 0000.002d 03 00000268 000265bb
00c4 0000.0030 03 0000026c 000f1d32
00c4 0000.0034 03 00000388 007251e9
TID 資料行會為每個線程提供線程標識碼。 LASTTIME 資料行包含每個線程上一次變更狀態的時間戳。
每當伺服器收到要求時,至少有一個線程會變更狀態,而且其時間戳將會更新。 因此,如果對伺服器提出 RPC 要求,而該要求失敗,但沒有任何時間戳發生變更,這代表要求實際上未到達 RPC 執行階段。 您應該調查此原因。