Condividi tramite


Controllo bug 0x1AB: UNWIND_ON_INVALID_STACK

Il controllo UNWIND_ON_INVALID_STACK bug ha un valore di 0x000001AB. Indica che è stato effettuato un tentativo di accesso alla memoria all'esterno dell'intervallo di stack di kernel valido. In particolare, questo BugCheck indica che lo stack di rimozione incrociato in uno stack di kernel non valido. Ciò potrebbe indicare che il puntatore dello stack del kernel è stato danneggiato durante l'invio o la rimozione delle eccezioni (ad esempio, a causa del danneggiamento dello stack di un puntatore del frame) o che un driver è in esecuzione fuori da uno stack che non è uno stack di kernel legale.

Al momento in cui si è verificato l'accesso non valido, il record di eccezione non è stato disponibile.

Importante

Questo articolo è destinato ai programmatori. Se si è un cliente che ha ricevuto un codice di errore dello schermo blu durante l'uso del computer, vedere Risolvere gli errori dello schermo blu.

parametri UNWIND_ON_INVALID_STACK

Parametro Descrizione

1

Puntatore allo stack corrente.

2

Tipo di limite dello stack, ad esempio NormalStackLimits (3). Poiché lo stack non è valido, questo rappresenta la stima migliore del kernel in base al tipo di stack di kernel che deve essere attivo in base allo stato del computer.

Tipo di limite dello stack:

  • 0x0 - Stack di bugcheck (qualsiasi stack se i limiti dello stack vengono calcolati durante il tempo di controllo dei bug)
  • 0x1 - Stack DPC del processore
  • 0x2 - Stack KeExpandKernelStackAndCallout(Ex)
  • 0x3 - Stack di thread kernel normale
  • 0x4 - Stack di thread kernel durante lo scambio del contesto di thread (ambiguo che è attivo il thread)
  • 0x5 - Stack di callout win32k
  • 0x6 - Stack ISR del processore
  • 0x7 - Stack del debugger del kernel (qualsiasi stack quando il debugger del kernel gestisce L/O KD)
  • 0x8 - Stack di gestione di NMI del processore
  • 0x9 - Stack di gestione del controllo del computer del processore
  • 0xA - Stack di eccezioni del processore (usato per inviare determinate eccezioni IRQL generate)

3

Puntatore al record di contesto che rappresenta il contesto che è stato interrotto (o inviato per un'eccezione) quando è stato rilevato lo stack non valido.

4

ExceptionRecord - Riservato e sempre 0 per UNWIND_ON_INVALID_STACK.

Causa

Si è verificato un tentativo di accesso a uno stack non valido. Poiché lo stack di kernel è limitato in dimensioni, lo sviluppatore deve prestare attenzione al rilevamento dei limiti, ad esempio quando lo si usa per copiare blocchi di memoria video. Per informazioni sullo stack del kernel di Windows, vedere Uso dello stack di kernel.

Risoluzione

Usando un dump completo del kernel o un debugger collegato, i comandi seguenti possono essere utili per raccogliere informazioni e tenere traccia del codice che accede in modo errato alla memoria.

Usare prima di tutto il comando !analyze per raccogliere informazioni, in particolare i parametri di controllo dei bug. Esaminare anche la riga di origine di errore e il nome del modulo, se disponibile.

Arguments:
Arg1: 89344350fffff607
Arg2: 0000000000000003
Arg3: fffff607893436c4
Arg4: fffff60789343ea8

Usare il collegamento al comando con estensione trap specificato nell'output !analizza per impostare il contesto sul frame trap.

TRAP_FRAME:  fffff60789343f50 -- (.trap 0xfffff60789343f50)
NOTE: The trap frame does not contain all registers.
Some register values may be zeroed or incorrect.
rax=fffff607893441e8 rbx=0000000000000000 rcx=0000000010000004
rdx=0000000000000002 rsi=0000000000000000 rdi=0000000000000000
rip=fffff8026dc296cf rsp=fffff607893440e8 rbp=fffff60789344350
 r8=fffff8028e7a08b2  r9=0000000000000008 r10=fffff8029e9c3980
r11=fffff607893440f8 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000

Usare il comando !thread per raccogliere informazioni sull'esecuzione. In questo esempio sembra che sia in esecuzione un thread di lavoro dell'utilità di pianificazione video.

2: kd> !thread
THREAD ffff8f8e9af25080  Cid 0004.0378  Teb: 0000000000000000 Win32Thread: 0000000000000000 RUNNING on processor 2
Not impersonating
DeviceMap                 ffffd601dbe63e30
Owning Process            ffff8f8e99ab4040       Image:         System
Attached Process          N/A            Image:         N/A
Wait Start TickCount      14361          Ticks: 0
Context Switch Count      64607          IdealProcessor: 1             
UserTime                  00:00:00.000
KernelTime                00:00:06.046
Win32 Start Address dxgmms2!VidSchiWorkerThread (0xfffff8027a70d100)
Stack Init fffff60789344c70 Current fffff607893445c0
Base fffff60789345000 Limit fffff6078933f000 Call 0000000000000000
Priority 16 BasePriority 16 PriorityDecrement 0 IoPriority 2 PagePriority 5
...

Usare quindi kb (Display Stack Backtrace) con l'opzione f per visualizzare lo stack e l'utilizzo della memoria per verificare se è presente un utente di memoria di grandi dimensioni.

2: kd> kf
...
02       198 fffff607`89344460 fffff802`8e6b41d5     amdkmdag+0x2308b2
03       120 fffff607`89344580 fffff802`8e59eb35     amdkmdag+0x1441d5
04        30 fffff607`893445b0 fffff802`8e62b5e8     amdkmdag+0x2eb35
05        c0 fffff607`89344670 fffff802`8e623f6c     amdkmdag+0xbb5e8
...

Se una parte specifica del codice sembra sospetta, usare il comando u, ub, uu (Unassemble) per esaminare il codice del linguaggio di assemblaggio associato.

2: kd> u fffff607`893442c8 l10
fffff607`893442c8 d04234          rol     byte ptr [rdx+34h],1
fffff607`893442cb 8907            mov     dword ptr [rdi],eax
fffff607`893442cd f6ff            idiv    bh
fffff607`893442cf ff01            inc     dword ptr [rcx]
fffff607`893442d1 17              ???
fffff607`893442d2 c4              ???
fffff607`893442d3 9f              lahf
fffff607`893442d4 8e8fffff0060    mov     cs,word ptr [rdi+6000FFFFh]
fffff607`893442da 5a              pop     rdx
fffff607`893442db 9f              lahf
fffff607`893442dc 8e8fffff0000    mov     cs,word ptr [rdi+0FFFFh]
fffff607`893442e2 0000            add     byte ptr [rax],al
fffff607`893442e4 0000            add     byte ptr [rax],al
fffff607`893442e6 0000            add     byte ptr [rax],al
fffff607`893442e8 7527            jne     fffff607`89344311
fffff607`893442ea 6e              outs    dx,byte ptr [rsi]

Usare il comando .cxr (Display Context Record) per visualizzare il record di contesto usando il valore del parametro 3 fornito da !analysis.

.cxr fffff607893436c4

Usare il comando !vm per esaminare l'utilizzo della memoria, ad esempio per visualizzare la quantità di memoria dello stack di kernel in uso.

0: kd> !vm

Physical Memory:          1541186 (    6164744 Kb)
Available Pages:           470550 (    1882200 Kb)
ResAvail Pages:           1279680 (    5118720 Kb)

...

Kernel Stacks:              13686 (      54744 Kb)

Usare il comando !stacks con il parametro 2 per visualizzare le informazioni sugli stack. Questo comando potrebbe richiedere tempo per l'esecuzione. Esaminare l'output per modelli ripetuti di esecuzione bloccata che possono puntare verso e area per ulteriori indagini.

Vedere anche

Riferimento al codice del controllo errori