Compartir a través de


Uso de !ks.graph

El comando !ks.graph es uno de los comandos de extensión más eficaces del módulo de extensión de streaming del kernel. Este comando muestra una imagen de un grafo completo en modo kernel desde cualquier punto de partida determinado.

Antes de ejecutar !ks.graph, es posible que desee habilitar todas las extensiones de biblioteca que sean capaces de estar activas. Para ello, emita un comando enableall !ks.libexts . La salida de !ks.graph será una descripción textual del gráfico de modo kernel en orden topológico. Este es un ejemplo:

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

En este ejemplo se muestra un gráfico de captura en el que dos Sndrec32.exe capturan desde un micrófono USB telex. Cada registro individual comienza con un nombre (usbaudio, en la sección anterior) y muestra la dirección de filtro (0xFFAAA768) y la cantidad de fábricas de patillas secundarias (2) en el filtro.

Debajo de cada entrada, cada generador se enumera y enumera la dirección de cada instancia de anclaje (0xFFB1CAF0), el objeto de archivo (0x811DEEB8) correspondiente a cada instancia, la dirección de la conexión, el destino de esa conexión y la dirección del pin de destino (0xFFA8B008). También se muestra el número de IRP en cola (7) y pendientes (1) para cada patilla.

Las conexiones que tienen símbolos de dirección hacia delante (->) indican que el pin es un pin de salida y está conectado a un pin de entrada. Las conexiones que tienen símbolos de dirección inversa (<-), por otro lado, son patillas de entrada y muestran la originación de la conexión. La salida continúa de la siguiente manera:

"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

Para seguir el gráfico, use el procedimiento siguiente:

Para seguir este gráfico:

  1. Busca el pin de interés. Considere la posibilidad de 0xFFB1CAF0, el pin de salida de usbaudio (fábrica 0).

  2. Busque el pin conectado. En este ejemplo, se trata de 0xFFA8B008 de patilla divisora.

  3. Examine la dirección de conexión y mueva visualmente de esa manera el nombre del filtro. (Recuerde que la lista está ordenada de forma topológica). En este ejemplo, la flecha que apunta a la derecha indica que es necesario buscar debajo de esta entrada en la lista para buscar el pin correspondiente. El filtro divisor 0xFFA0C660 está inmediatamente debajo.

  4. Busque la dirección de anclaje de destino en la lista de instancias de patillas de filtro. En este caso, esta dirección es 0xFFA8B008.

El comando Para seguir este gráfico: también se puede usar para analizar gráficos detenidos desde cualquier punto de partida determinado. Para ello, especifique 4 en el parámetro 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!

Para este resultado, examine la lista "sospechosos". Estos filtros sospechosos son aquellos que están en la ruta crítica de progreso que se está realizando en el gráfico. Comience la depuración desde ese punto en función de los motivos por los que el analizador ha generado para el bloqueo.

Nota Esta funcionalidad solo debe usarse en gráficos detenidos. El analizador no tiene forma de saber cuánto tiempo ha estado el grafo en este estado. La división en el depurador y el análisis de un grafo en ejecución como un grafo detenido todavía muestra un filtro sospechoso.