Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
RPC richiede che i thread di lavoro siano disponibili per eseguire normalmente. Un problema comune è che alcuni componenti dello stesso processo possono bloccarsi mantenendo una delle sezioni critiche globali, ad esempio il blocco del loader o il blocco dell'heap. Questo causerà il blocco di molti thread, includendo molto probabilmente alcuni thread di lavoro RPC.
In questo caso, il server RPC non risponderà al mondo esterno. Le chiamate RPC a esso restituiranno RPC_S_SERVER_UNAVAILABLE o RPC_S_SERVER_TOO_BUSY.
Un problema simile può risultare se un driver difettoso impedisce agli IRP di completarsi e di raggiungere il server RPC.
Se si sospetta che si verifichi uno di questi problemi, usare DbgRpc con l'opzione -t oppure usare l'estensione !rpcexts.getthreadinfo). L'ID del processo deve essere usato come parametro. Nell'esempio seguente si supponga che l'ID processo sia 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
La colonna TID fornisce l'ID thread per ogni thread. La colonna LASTTIME contiene il timestamp dell'ultima modifica nello stato per ogni thread.
Ogni volta che il server riceve una richiesta, almeno un thread cambierà lo stato e il timestamp verrà aggiornato. Pertanto, se viene effettuata una richiesta RPC al server e la richiesta ha esito negativo ma nessun timestamp cambia, indica che la richiesta non raggiunge effettivamente il runtime RPC. È consigliabile indagare sulla causa di questo problema.