Analisi di uno stallo di acquisizione

Di seguito è riportato uno scenario creato artificialmente che simula un blocco di acquisizione. Si tratta di uno scenario particolarmente prezioso perché si verificano spesso situazioni simili nei test di stress. Lo scenario è il seguente:

Il componente di registrazione di Windows Sndrec32 sta registrando dal dispositivo di acquisizione principale, in questo caso un dispositivo wave Creative SBLive. Per un periodo di tempo, registra normalmente; tuttavia, il grafico si blocca a 8,50 secondi perché abbiamo esplicitamente impedito a portcls di completare gli IRP di acquisizione ai fini di questo test.

L'applicazione risulta in esecuzione, ma la posizione del flusso non avanza. La posizione viene interrotta a 8,50 secondi.

Poiché il dispositivo di acquisizione principale in questo computer è una scheda audio PCI, usare prima il comando !ks.pciaudio per provare a determinare un punto di partenza. Usare un valore flag pari a 1 per richiedere una visualizzazione di tutti i flussi in esecuzione:

kd> !pciaudio 1

1 Audio FDOs found:
 Functional Device 8121c030 [\Driver\emu10k]
        Wave Cyclic Streams:
            Pin 812567c0 RUN [emu10k1m!CMiniportWaveCyclicStreamSBLive ff9ec7f8] 

In questo caso, è presente un solo dispositivo audio PCI e viene gestito dal driver Intel emu10k (\Driver\emu10k). Questo driver ha attualmente un singolo flusso in esecuzione (0x812567C0). È ora possibile usare !ks.graph per visualizzare il grafico del kernel. Impostare Livello e Flag entrambi su 7 per ottenere la massima definizione sullo stallo:

kd> !graph 812567c0 7 7
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
 Queued: 81255418 811df008 81252008 81255280 81250b30 ffa1fe70 81252e70 ffa01d98 

Quanto sopra mostra i dettagli per la fabbrica 0. Il pin di output emu10k 0x812567C0 è connesso al pin di input splitter 0x811DF960. Ci sono otto IRP in coda per il pin di output di emu10k. L'output di !ks.graph è il seguente:

"splitter" Filter ffb18890, Child Factories 2
    Output Factory 0:
        Pin 811df430 (File ffa55f90) Irps(q/p) = 10, 0
 Queued: ffadd008 ffa73b00 ffa1e998 811de310 ffa54370 ffaaf008 811dee70 81250e70 811de580 811de8c0 

Ci sono dieci IRP in coda per il pin di output dello splitter.

    Input Factory 1:
        Pin 811df960 (File 81187820, <- "emu10k" 812567c0) Irps(q/p) = 0, 8
            Pending: 81255418 811df008 81252008 81255280 81250b30 ffa1fe70 81252e70 ffa01d98 

Il pin di input di Splitter non ha IRP in coda; tuttavia, è in attesa che otto IRP provenienti da emu10k entrino nella coda.

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

Da queste informazioni, l'analizzatore suggerisce che emu10k o WaveCyclic potrebbero essere in errore. Fornisce inoltre un elenco dei sospetti IRP; si tratta degli IRP accodati al pin di input di emu10k. Se uno di questi IRP dovesse essere completato, lo splitter copierebbe i dati, completerebbe un IRP e il grafico progredirebbe. Per qualche motivo, emu10k non sta completando quei pacchetti di richiesta I/O (IRPs).