Uso di !ks.graph

Il comando !ks.graph è uno dei comandi di estensione più potenti nel modulo di estensione di streaming del kernel. Questo comando visualizza un'immagine di un intero grafico in modalità kernel da qualsiasi punto iniziale specificato.

Prima di eseguire !ks.graph, è possibile abilitare tutte le estensioni della libreria in grado di essere attive. A tale scopo, eseguire un comando !ks.libexts enableall . L'output di !ks.graph sarà una descrizione testuale del grafico in modalità kernel in ordine topologico. Esempio:

kd> !graph ffa0c6d4 7
Attempting a graph build on ffa0c6d4...  Please be patient...
Graph With Starting Point ffa0c6d4:
"usbaudio" Filter ffaaa768, Child Factories 2
    Output Factory 0:
        Pin ffb1caf0 (File 811deeb8, -> "splitter" ffa8b008) Irps(q/p) = 7, 1

In questo esempio viene visualizzato un grafico di acquisizione in cui due Sndrec32.exe acquisiscono da un microfono USB Telex. Ogni singolo record inizia con un nome (usbaudio, nella sezione precedente) e mostra l'indirizzo del filtro (0xFFAAA768) e la quantità di pin factory figlio (2) sul filtro.

Sotto ogni voce, ogni factory viene enumerata ed elenca l'indirizzo di ogni istanza del pin (0xFFB1CAF0), l'oggetto file (0x811DEEB8) corrispondente a ogni istanza, la direzione della connessione, la destinazione della connessione e l'indirizzo del pin di destinazione (0xFFA8B008). Viene visualizzato anche il numero di irP in coda (7) e in sospeso (1) per ogni pin.

Le connessioni con simboli di direzione in avanti (->) indicano che il pin è un pin di output ed è connesso a un pin di input. Le connessioni con simboli di direzione inversa (<-), d'altra parte, sono pin di input e mostrano l'origine della connessione. L'output continua come segue:

"splitter" Filter ffa0c660, Child Factories 2
    Output Factory 0:
        Pin 81250008 (File ffb10028, -> "kmixer" 8123c000) Irps(q/p) = 3, 0
        Pin 811df9c0 (File ffaaf2f0, -> "kmixer" 81236000) Irps(q/p) = 3, 0
    Input Factory 1:
        Pin ffa8b008 (File ffb26d68, <- "usbaudio" ffb1caf0) Irps(q/p) = 1, 7
"kmixer" Filter ffa65b70, Child Factories 4
    Input Factory 2:
        Pin 81236000 (File ffaaf7d0, <- "splitter" 811df9c0) Irps(q/p) = 0, 0
    Output Factory 3:
        Pin 81252d00 (File 811df1d8) Irps(q/p) = 10, 0
"kmixer" Filter ffb03808, Child Factories 4
    Input Factory 2:
        Pin 8123c000 (File ffb10130, <- "splitter" 81250008) Irps(q/p) = 0, 0
    Output Factory 3:
        Pin ffa1e9c0 (File 81253468) Irps(q/p) = 10, 0

Per seguire il grafico, usare la procedura seguente:

Per seguire questo grafico:

  1. Trovare il pin di interesse. Prendere in considerazione 0xFFB1CAF0, il pin di output di usbaudio (factory 0).

  2. Trovare il pin connesso. In questo esempio si tratta di pin di divisione 0xFFA8B008.

  3. Esaminare la direzione della connessione e spostarsi visivamente in questo modo cercando il nome del filtro. Tenere presente che l'elenco è ordinato in modo topologico. In questo esempio, la freccia a destra indica che è necessario esaminare sotto questa voce nell'elenco per trovare il pin corrispondente. Il filtro di divisione 0xFFA0C660 è immediatamente inferiore.

  4. Trovare l'indirizzo del pin di destinazione nell'elenco delle istanze del pin del filtro. In questo caso, questo indirizzo è 0xFFA8B008.

Il comando Per seguire questo grafico: può essere usato anche per analizzare i grafici bloccati da qualsiasi punto iniziale specificato. A tale scopo, specificare 4 nel parametro Flags :

kd> !graph 812567c0 7 4

Attempting a graph build on 812567c0...  Please be patient...

Graph With Starting Point 812567c0:

"emu10k" Filter ff9ebb98, Child Factories 5
    Output Factory 0:
        Pin 812567c0 (File 811c6630, -> "splitter" 811df960) Irps(q/p) = 8, 0
"splitter" Filter ffb18890, Child Factories 2
    Output Factory 0:
        Pin 811df430 (File ffa55f90) Irps(q/p) = 10, 0
    Input Factory 1:
        Pin 811df960 (File 81187820, <- "emu10k" 812567c0) Irps(q/p) = 0, 8

Analyzing a Hung Graph From 812567c0:

Suspect Filters (For a Hung Graph):
    "emu10k" Filter ff9ebb98 or class "PortCls Wave Cyclic" is suspect.
        Reasons For This Analysis:
            - No critical pin has less than 8 queued Irps
            - Downstream "splitter" pin 811df960 is starved
        Irps to check:
            81255418 811df008 81252008 81255280 81250b30 ffa1fe70 81252e70 ffa01d98

NOTE: The above is based on heuristic analysis.  It is not designed to be a
      replacement for an actual developer looking at this particular hang!  The
      filters listed as suspects may or may not be the actual cause of the
      stall!

Per questo output, esaminare l'elenco "sospetti". Questi filtri sospetti sono quelli che si trovano nel percorso critico di avanzamento eseguito nel grafico. Avviare il debug da quel punto in base ai motivi per cui l'analizzatore ha prodotto per lo stallo.

Nota Questa funzionalità deve essere usata solo nei grafici bloccati. L'analizzatore non ha modo di sapere per quanto tempo il grafico è stato in questo stato. L'interruzione nel debugger e l'analisi di un grafico in esecuzione come grafico bloccato visualizza ancora un filtro sospetto.