Debug di un blocco di elaborazione

Per iniziare, trovare il pin pertinente. In un caso ipotetico, il pin di acquisizione video pertinente ha indirizzo 8160DDE0, quindi usiamo il comando !ks.dump estensione su questo indirizzo per ottenere altri dettagli:

kd> !ks.dump 8160DDE0 7
Pin object 8160DDE0 [CKsPin = 8160DD50]
    DeviceState    KSSTATE_RUN
    ClientState    KSSTATE_RUN
    CKsPin object 8160DD50 [KSPIN = 8160DDE0]
        State                    KSSTATE_RUN
        Processing Mutex         8160DFD0 is not held
        And Gate &               8160DF88
        And Gate Count           1

Determinare prima di tutto se il pin è nello stato appropriato e se il mutex di elaborazione viene mantenuto da un altro thread. In questo caso, lo stato del pin è KSSTATE_RUN, come dovrebbe essere e il mutex di elaborazione non viene mantenuto, quindi si userà quindi l'estensione!ks.dumpqueue per determinare se sono disponibili fotogrammi:

kd> !ks.dumpqueue 8160DDE0 7
Queue 8172D5D8:
 Frames Received  : 763
    Frames Waiting   : 5
...<this part of display not shown>...
Queue 8172D5D8:
 Frame Header 81B77E60:
        Irp = 816EE008
        Refcount = 1
    Frame Header 81A568D0:
        Irp = 816DE008
        Refcount = 0
    Frame Header 81844ED8:
        Irp = FFA0F650
        Refcount = 0
    Frame Header 8174B0B0:
        Irp = FFABB460
        Refcount = 0
    Leading Edge:
        Stream Pointer 8183EA58 [Public 8183EA90]:
            Frame Header = 81B77E60
...<this part of display not shown>...

Nella visualizzazione parziale precedente dell'output !ks.dumpqueue, si noterà che sono presenti cinque fotogrammi in attesa o già disponibili. Questi fotogrammi sono davanti o dietro il bordo iniziale? Nella visualizzazione !ks.dumpqueue, i frame vengono sempre elencati dal più vecchio al più nuovo. L'intestazione del frame del bordo anteriore corrisponde a quella del primo frame elencato, ovvero il frame più vecchio. Pertanto, tutti i fotogrammi disponibili sono davanti al bordo iniziale.

Se questo non fosse il caso, e invece tutti i fotogrammi fossero dietro il bordo di attacco, e avessero un conteggio di riferimento dovuto a puntatori clonati, i problemi più probabilmente hanno origine dall'hardware o dalla programmazione del driver hardware. Assicurarsi che l'hardware segnali i completamenti del buffer (controlli interrupt e DPC) e determinare che il driver risponde in modo appropriato a tali notifiche (eliminando cloni al completamento del buffer, ad esempio).

Se, come nel nostro esempio, tutti i fotogrammi sono davanti al margine anteriore, il problema è quasi certamente legato al software. Per ottenere ulteriori informazioni, consultare la porta AND del pin.

interpretare il cancello e

L'And gate del pin controlla l'elaborazione. Se il numero di gate è uno, l'elaborazione può avvenire. Ottenere lo stato corrente della porta AND usando l'estensione !ks.dump:

kd> !ks.dump 8160DDE0 7
Pin object 8160DDE0 [CKsPin = 8160DD50]
    DeviceState    KSSTATE_RUN
    ClientState    KSSTATE_RUN
    CKsPin object 8160DD50 [KSPIN = 8160DDE0]
        State                    KSSTATE_RUN
        Processing Mutex         8160DFD0 is not held
        And Gate &               8160DF88
        And Gate Count           1

Perché il conteggio dei cancelli è uno, il cancello E è aperto. In questo caso, esaminare le possibili cause seguenti per il blocco di elaborazione:

  • L'invio del processo ha restituito in modo non corretto STATUS_PENDING.

  • Nel caso di disponibilità dei dati manca una chiamata KsPinAttemptProcessing.