Identificando o chamador do thread do servidor
É possível determinar o que fez uma determinada chamada RPC, mesmo que a única informação que você tenha seja o thread do servidor que tomou conta da chamada.
Isso pode ser muito útil , por exemplo, para descobrir quem passou parâmetros inválidos para uma chamada RPC.
Dependendo de qual sequência de protocolo é usada por essa chamada específica, você pode obter diferentes graus de detalhes. Alguns protocolos (como NetBios) não têm essas informações.
Identificando o chamador do thread do servidor
Inicie um depurador no modo de usuário com o thread do servidor como o destino.
Obter a ID do processo usando o | (Status do Processo) Comando:
0:001> | 0 id: 3d4 name: rtsvr.exe
Obtenha as chamadas ativas nesse processo usando a extensão !rpcexts.getcallinfo . (Consulte a página de referência para obter uma explicação da sintaxe.) Você precisa fornecer a ID do processo de 0x3D4:
0:001> !rpcexts.getcallinfo 0 0 FFFF 3d4 Searching for call info ... PID CELL ID ST PNO IFSTART THRDCELL CALLFLAG CALLID LASTTIME CONN/CLN ---------------------------------------------------------------------------- 03d4 0000.0004 02 000 19bb5061 0000.0002 00000001 00000001 00a1aced 0000.0003
Procure chamadas com status 02 ou 01 (despachado ou ativo). Neste exemplo, o processo tem apenas uma chamada. Se houvesse mais, você teria que usar a extensão !rpcexts.getdbgcell com o número da célula na coluna THRDCELL. Isso permitiria examinar as IDs de thread para que você pudesse determinar em qual chamada você estava interessado.
Depois de saber em qual chamada você está interessado, examine o número da célula na coluna CONN/CLN. Essa é a ID da célula do objeto de conexão. Nesse caso, o número da célula é 0000.0003. Passe esse número de célula e a ID do processo para !rpcexts.getdbgcell:
0:001> !rpcexts.getdbgcell 3d4 0.3 Getting cell info ... Connection Connection flags: Exclusive Authentication Level: Default Authentication Service: None Last Transmit Fragment Size: 24 (0x6F56D) Endpoint for the connection: 0x0.1 Last send time (in seconds since boot):10595.565 (0x2963.235) Last receive time (in seconds since boot):10595.565 (0x2963.235) Getting endpoint info ... Process object for caller is 0xFF9DF5F0
Essa extensão exibirá todas as informações disponíveis sobre o cliente dessa conexão. A quantidade de informações reais variará, dependendo do transporte que está sendo usado.
Neste exemplo, pipes nomeados locais estão sendo usados como o transporte e o endereço do objeto de processo do chamador é exibido. Se você anexar um depurador de kernel (ou iniciar um depurador de kernel local), poderá usar a extensão !process para interpretar esse endereço de processo.
Se LRPC for usado como transporte, a ID do processo e a ID do thread do chamador serão exibidas.
Se TCP for usado como transporte, o endereço IP do chamador será exibido.
Se pipes nomeados remotos forem usados como transporte, nenhuma informação estará disponível.
Nota O exemplo anterior mostra como localizar o thread do cliente se você conhece o thread do servidor. Para obter um exemplo da técnica inversa, consulte Analisando um problema de chamada paralisada.