Partilhar via


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

  1. Inicie um depurador no modo de usuário com o thread do servidor como o destino.

  2. Obter a ID do processo usando o | (Status do Processo) Comando:

    0:001> |
      0     id: 3d4 name: rtsvr.exe
    
  3. 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.

  4. 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.