Korzystanie z !ks.graph

Polecenie !ks.graph jest jednym z najbardziej zaawansowanych poleceń rozszerzenia w module rozszerzenia przesyłania strumieniowego jądra. To polecenie wyświetla obraz całego grafu w trybie jądra z dowolnego punktu początkowego.

Przed uruchomieniem programu !ks.graph możesz włączyć wszystkie rozszerzenia biblioteki, które mogą być aktywne. W tym celu wydaj polecenie !ks.libexts enableall. Dane wyjściowe programu !ks.graph będą tekstowym opisem grafu trybu jądra w kolejności posortowanej topologicznie. Oto przykład:

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

W tym przykładzie przedstawiono wykres przechwytywania, w którym dwa Sndrec32.exeprzechwytują dźwięk za pomocą mikrofonu USB Telex. Każdy pojedynczy rekord zaczyna się od nazwy (usbaudio, w powyższej sekcji) i pokazuje adres filtru (0xFFAAA768) i ilość podrzędnych fabryk pinów (2) w filtrze.

Poniżej każdego wpisu wymienione są fabryki, a także wyświetlane są adresy każdego wystąpienia pinu (0xFFB1CAF0), obiektu pliku (0x811DEEB8) odpowiadającego każdemu wystąpieniu, kierunek połączenia, cel tego połączenia i adres pinu docelowego (0xFFA8B008). Wyświetlana jest również liczba IRP zakolejkowanych (7) i oczekujących (1) dla każdego numeru PIN.

Połączenia, które mają symbole kierunku do przodu (->), wskazują, że pin jest wyprowadzeniem wyjściowym i jest połączone do pinu wejściowego. Połączenia, które mają symbole odwrotnego kierunku (<-), natomiast są pinami wejściowymi i pokazują źródło połączenia. Wynik przedstawia się następująco:

"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

Aby zrozumieć wykres, zastosuj następującą procedurę:

Aby postępować zgodnie z tym wykresem:

  1. Znajdź interesujący PIN. Rozważ 0xFFB1CAF0, pin wyjściowy usbaudio (fabryczny 0).

  2. Znajdź podłączony pin. W tym przykładzie jest to pin rozdzielnicy 0xFFA8B008.

  3. Spójrz na kierunek połączenia i wizualnie przenieś się w ten sposób, szukając nazwy filtru. (Pamiętaj, że lista jest posortowana topologicznie). W tym przykładzie strzałka wskazująca prawo wskazuje, że musimy przyjrzeć się poniżej tego wpisu na liście, aby znaleźć odpowiedni numer PIN. Filtr rozdzielający 0xFFA0C660 znajduje się bezpośrednio poniżej.

  4. Znajdź adres pinu docelowego na liście wystąpień pinów filtra. W tym przypadku ten adres jest 0xFFA8B008.

Polecenie "Śledź ten wykres:" można również użyć do analizowania wykresów zawieszonych z dowolnego punktu początkowego. W tym celu określ wartość 4 w parametrze 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!

W przypadku takich danych wyjściowych spójrz na listę „podejrzanych”. Te podejrzane filtry to te, które znajdują się na krytycznej ścieżce postępu w grafie. Rozpocznij debugowanie od tego punktu na podstawie powodów, które analizator wygenerował dla zatrzymania.

Uwaga Ta funkcja powinna być używana tylko na zatrzymanych grafach! Analizator nie ma sposobu, aby dowiedzieć się, jak długo grafu jest w tym stanie. Przechodzenie do debuggera i analizowanie uruchomionego grafu jak zatrzymanego grafu nadal wskazuje na podejrzany filtr.