다음을 통해 공유


중단된 스레드 확인

RPC는 정상적으로 수행하려면 해당 작업자 스레드를 사용할 수 있어야 합니다. 일반적인 문제는 글로벌 중요 섹션(예: 로더 잠금 또는 힙 잠금) 중 하나를 보유하는 동안 동일한 프로세스의 일부 구성 요소가 교착 상태에 빠지는 것입니다. 이로 인해 일부 RPC 작업자 스레드를 포함하여 많은 스레드가 중단될 수 있습니다.

이 경우 RPC 서버는 외부 세계에 응답하지 않습니다. RPC 호출은 RPC_S_SERVER_UNAVAILABLE 또는 RPC_S_SERVER_TOO_BUSY 반환합니다.

결함이 있는 드라이버로 인해 IRP가 RPC 서버를 완료하고 연결할 수 없는 경우에도 비슷한 문제가 발생할 수 있습니다.

이러한 문제 중 하나가 발생할 수 있다고 의심되는 경우 -t 스위치와 함께 DbgRpc를 사용하거나 !rpcexts.getthreadinfo 확장을 사용합니다. 프로세스 ID를 매개 변수로 사용해야 합니다. 다음 예제에서는 프로세스 ID가 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 열은 각 스레드에 대한 스레드 ID를 제공합니다. LASTTIME 열에는 각 스레드에 대한 마지막 상태 변경의 타임스탬프를 포함합니다.

서버가 요청을 받을 때마다 하나 이상의 스레드가 상태를 변경하고 타임스탬프를 업데이트합니다. 따라서 서버에 대한 RPC 요청이 수행되고 요청이 실패하지만 타임스탬프가 변경되지 않는 경우 이는 요청이 실제로 RPC 런타임에 도달하지 않음을 나타냅니다. 원인을 조사해야 합니다.