Freigeben über


Identifizieren des Aufrufers aus dem Serverthread

Es ist möglich zu bestimmen, was einen bestimmten RPC-Aufruf ausgeführt hat, auch wenn die einzigen Informationen, die Sie haben, der Serverthread ist, der den Aufruf bedient hat.

Dies kann sehr nützlich sein, z. B. um herauszufinden, wer ungültige Parameter an einen RPC-Aufruf übergeben hat.

Je nachdem, welche Protokollsequenz von diesem speziellen Aufruf verwendet wird, können Sie unterschiedliche Detailgrade erhalten. Einige Protokolle (z. B. NetBios) enthalten diese Informationen überhaupt nicht.

Identifizieren des Aufrufers aus dem Serverthread

  1. Starten Sie einen Debugger im Benutzermodus mit dem Serverthread als Ziel.

  2. Abrufen der Prozess-ID mithilfe von | (Prozessstatus) Befehl:

    0:001> |
      0     id: 3d4 name: rtsvr.exe
    
  3. Rufen Sie die aktiven Aufrufe in diesem Prozess mithilfe der Erweiterung !rpcexts.getcallinfo ab. (Eine Erläuterung der Syntax finden Sie auf der Referenzseite.) Sie müssen die Prozess-ID von 0x3D4 angeben:

    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
    

    Suchen Sie nach Anrufen mit status 02 oder 01 (versendet oder aktiv). In diesem Beispiel weist der Prozess nur einen Aufruf auf. Wenn mehr vorhanden wären, müssten Sie die Erweiterung !rpcexts.getdbgcell mit der Zellennummer in der Spalte THRDCELL verwenden. Auf diese Weise können Sie die Thread-IDs untersuchen, um zu ermitteln, an welchem Aufruf Sie interessiert sind.

  4. Nachdem Sie wissen, an welchem Anruf Sie interessiert sind, sehen Sie sich die Zellennummer in der SPALTE CONN/CLN an. Dies ist die Zellen-ID des Verbindungsobjekts. In diesem Fall ist die Zellennummer 0000.0003. Übergeben Sie diese Zellennummer und die Prozess-ID an !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
    

Diese Erweiterung zeigt alle verfügbaren Informationen zum Client dieser Verbindung an. Die Menge der tatsächlichen Informationen variiert je nach verwendetem Transport.

In diesem Beispiel werden lokale Named Pipes als Transport verwendet, und die Prozessobjektadresse des Aufrufers wird angezeigt. Wenn Sie einen Kerneldebugger anfügen (oder einen lokalen Kerneldebugger starten), können Sie die Erweiterung !process verwenden, um diese Prozessadresse zu interpretieren.

Wenn LRPC als Transport verwendet wird, werden die Prozess-ID und die Thread-ID des Aufrufers angezeigt.

Wenn TCP als Transport verwendet wird, wird die IP-Adresse des Aufrufers angezeigt.

Wenn Remote-Named Pipes als Transport verwendet werden, sind keine Informationen verfügbar.

Hinweis Im vorherigen Beispiel wird gezeigt, wie Sie den Clientthread finden, wenn Sie den Serverthread kennen. Ein Beispiel für die umgekehrte Technik finden Sie unter Analysieren eines Problems mit hängen gebliebenen Anrufen.