共用方式為


檢查停滯的執行緒

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 執行時間。 您應該調查此原因。