Condividi tramite


0x1E di controllo dei bug: KMODE_EXCEPTION_NOT_HANDLED

Il controllo dei bug KMODE_EXCEPTION_NOT_HANDLED ha un valore pari a 0x0000001E. Il controllo dei bug indica che un programma in modalità kernel ha generato un'eccezione che il gestore errori non ha intercettato.

Importante

Questo articolo è destinato ai programmatori. Se si è un cliente Microsoft e il computer visualizza un codice di errore della schermata blu, vedere Risolvere gli errori della schermata blu.

parametri KMODE_EXCEPTION_NOT_HANDLED

Parametro Descrizione
1 Codice di eccezione non gestito.
2 Indirizzo in cui si è verificata l'eccezione.
3 Parametro di informazioni sulle eccezioni 0 del record di eccezione.
4 Parametro di informazioni sulle eccezioni 0 del record di eccezione.

Causa

Per interpretare questo controllo dei bug, è necessario identificare l'eccezione generata.

I codici di eccezione comuni includono:

  • 0x80000002: STATUS_DATATYPE_MISALIGNMENT

    È stato rilevato un riferimento ai dati non allineato.

  • 0x80000003: STATUS_BREAKPOINT

    È stato rilevato un punto di interruzione o ASSERT quando non è stato collegato alcun debugger del kernel al sistema.

  • 0xC0000005: STATUS_ACCESS_VIOLATION

    Si è verificata una violazione dell'accesso alla memoria. Il parametro 4 del controllo del bug è l'indirizzo a cui il driver ha tentato di accedere.

Per un elenco completo dei codici di eccezione, vedere Valori NTSTATUS. I codici di eccezione sono definiti in ntstatus.h, un file di intestazione presente in Windows Driver Kit. Per altre informazioni, vedere File di intestazione in Windows Driver Kit.

Osservazioni:

Se non si è dotati di eseguire il debug di questo problema, è possibile usare alcune tecniche di risoluzione dei problemi di base descritte in Analizzare i dati della schermata blu di controllo dei bug. Se un driver viene identificato nel messaggio di controllo dei bug, disabilitare il driver o rivolgersi al produttore per verificare la presenza di aggiornamenti dei driver.

Incompatibilità hardware

Verificare che qualsiasi nuovo hardware installato sia compatibile con la versione installata di Windows. Ad esempio, puoi ottenere informazioni sull'hardware richiesto nelle specifiche di Windows 10.

Driver di dispositivo o servizio di sistema difettoso

Un driver di dispositivo o un servizio di sistema difettoso potrebbe causare questo errore. I problemi hardware, ad esempio incompatibilità BIOS, conflitti di memoria e conflitti IRQ, possono anche generare questo errore.

Se un driver è elencato per nome nel messaggio di controllo dei bug, disabilitare o rimuovere tale driver. Disabilitare o rimuovere eventuali driver o servizi aggiunti di recente. Se l'errore si verifica durante la sequenza di avvio e la partizione di sistema è formattata come file system NTFS, potrebbe essere possibile usare la modalità provvisoria per disabilitare il driver in Gestione dispositivi.

Controllare l'accesso di sistema Visualizzatore eventi per altri messaggi di errore che potrebbero aiutare a identificare il dispositivo o il driver che causa il controllo dei bug 0x1E. Eseguire anche la diagnostica hardware fornita dal produttore del sistema, in particolare lo scanner di memoria. Per altre informazioni su questi passaggi per la risoluzione dei problemi, vedere il manuale del proprietario per il computer.

L'errore che genera questo messaggio potrebbe verificarsi dopo il primo riavvio durante l'installazione di Windows o dopo il completamento dell'installazione. Una possibile causa dell'errore è un'incompatibilità del BIOS di sistema. È possibile risolvere i problemi del BIOS aggiornando la versione del BIOS di sistema.

Risoluzione

Quando si esegue il debug di questo problema, potrebbe risultare difficile ottenere un'analisi dello stack. L'indirizzo dell'eccezione (parametro 2) deve identificare il driver o la funzione che ha causato il problema.

Il codice di eccezione 0x80000003 indica che è stato raggiunto un punto di interruzione o un'asserzione hardcoded, ma il sistema è stato avviato con l'opzione /NODEBUG . Questo problema dovrebbe verificarsi raramente. Se si verifica ripetutamente, assicurarsi che un debugger del kernel sia connesso e che il sistema venga avviato con l'opzione /DEBUG .

Se si verifica un codice di eccezione 0x80000002, il frame trap fornisce altre informazioni.

Causa sconosciuta

Se la causa specifica dell'eccezione è sconosciuta, è consigliabile usare la procedura seguente per ottenere un'analisi dello stack.

Nota

Questa procedura presuppone che sia possibile individuare NT!PspUnhandledExceptionInSystemThread. Tuttavia, in alcuni casi, come in un arresto anomalo della violazione di accesso, non sarà possibile trovare NT!PspUnhandledExceptionInSystemThread. In tal caso, cercare ntoskrnl!KiDispatchException. Il terzo parametro passato a questa funzione è un indirizzo del frame trap. Usare il comando trap (display trap frame) con questo indirizzo per impostare il contesto del registro sul valore corretto. È quindi possibile eseguire analisi dello stack ed eseguire altri comandi.

Ottenere un'analisi dello stack

Per ottenere un'analisi dello stack se le normali procedure di analisi dello stack hanno esito negativo:

  1. Usare il comando kb (display stack backtrace) per visualizzare i parametri nell'analisi dello stack. Cercare la chiamata a NT!PspUnhandledExceptionInSystemThread. Se questa funzione non è elencata, vedere la nota precedente.

  2. Il primo parametro di NT!PspUnhandledExceptionInSystemThread è un puntatore a una struttura. Il puntatore contiene puntatori a un'istruzione except :

    typedef struct _EXCEPTION_POINTERS {
        PEXCEPTION_RECORD ExceptionRecord;
        PCONTEXT ContextRecord;
        } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
    
    ULONG PspUnhandledExceptionInSystemThread(
        IN PEXCEPTION_POINTERS ExceptionPointers
        )
    

    Usare il comando dd (memoria di visualizzazione) su tale indirizzo per visualizzare i dati necessari.

  3. Il primo valore recuperato è un record di eccezione. Per il record di eccezione, usare il comando .exr (display exception record).

    Il secondo valore è un record di contesto. Per il record di contesto, usare il comando .cxr (record di contesto di visualizzazione).

  4. Dopo l'esecuzione del comando, usare il .cxr kb comando per visualizzare un'analisi dello stack basata sulle informazioni del record di contesto. Questa traccia dello stack indica lo stack di chiamate in cui si è verificata l'eccezione non gestita.

Verifica di bug di esempio

L'esempio seguente mostra un controllo dei bug 0x1E in un processore x86:

kd> .bugcheck                 get the bug check data
Bugcheck code 0000001e
Arguments c0000005 8013cd0a 00000000 0362cffff

kd> kb                        start with a stack trace 
FramePtr  RetAddr   Param1   Param2   Param3   Function Name 
8013ed5c  801263ba  00000000 00000000 fe40cb00 NT!_DbgBreakPoint 
8013eecc  8013313c  0000001e c0000005 8013cd0a NT!_KeBugCheckEx+0x194
fe40cad0  8013318e  fe40caf8 801359ff fe40cb00 NT!PspUnhandledExceptionInSystemThread+0x18
fe40cad8  801359ff  fe40cb00 00000000 fe40cb00 NT!PspSystemThreadStartup+0x4a
fe40cf7c  8013cb8e  fe43a44c ff6ce388 00000000 NT!_except_handler3+0x47
00000000  00000000  00000000 00000000 00000000 NT!KiThreadStartup+0xe

kd> dd fe40caf8 L2            dump EXCEPTION_POINTERS structure
0xFE40CAF8  fe40cd88 fe40cbc4                   ..@...@.

kd> .exr fe40cd88             first DWORD is the exception record
Exception Record @ FE40CD88:
   ExceptionCode: c0000005
  ExceptionFlags: 00000000
  Chained Record: 00000000
ExceptionAddress: 8013cd0a
NumberParameters: 00000002
   Parameter[0]: 00000000
   Parameter[1]: 0362cfff

kd> .cxr fe40cbc4             second DWORD is the context record
CtxFlags: 00010017
eax=00087000 ebx=00000000 ecx=03ff0000 edx=ff63d000 esi=0362cfff edi=036b3fff
eip=8013cd0a esp=fe40ce50 ebp=fe40cef8 iopl=0         nv dn ei pl nz ac po cy
vip=0    vif=0
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010617
0x8013cd0a  f3a4             rep movsb

kd> kb                        kb gives stack for context record
ChildEBP RetAddr  Args to Child
fe40ce54 80402e09 ff6c4000 ff63d000 03ff0000 NT!_RtlMoveMemory@12+0x3e
fe40ce68 80403c18 ffbc0c28 ff6ce008 ff6c4000 HAL!_HalpCopyBufferMap@20+0x49
fe40ce9c fe43b1e4 ff6cef90 ffbc0c28 ff6ce009 HAL!_IoFlushAdapterBuffers@24+0x148
fe40ceb8 fe4385b4 ff6ce388 6cd00800 ffbc0c28 QIC117!_kdi_FlushDMABuffers@20+0x28
fe40cef8 fe439894 ff6cd008 ffb6c820 fe40cf4c QIC117!_cqd_CmdReadWrite@8+0x26e
fe40cf18 fe437d92 ff6cd008 ffb6c820 ff6e4e50 QIC117!_cqd_DispatchFRB@8+0x210
fe40cf30 fe43a4f5 ff6cd008 ffb6c820 00000000 QIC117!_cqd_ProcessFRB@8+0x134
fe40cf4c 80133184 ff6ce388 00000000 00000000 QIC117!_kdi_ThreadRun@4+0xa9
fe40cf7c 8013cb8e fe43a44c ff6ce388 00000000 NT!_PspSystemThreadStartup@8+0x40