Controllo bug 0x1AA: EXCEPTION_ON_INVALID_STACK

Il controllo bug EXCEPTION_ON_INVALID_STACK ha un valore pari a 0x000001AA. Questo controllo bug indica che l'eccezione viene inviata incrociata in uno stack del kernel non valido. Ciò potrebbe indicare che il puntatore dello stack del kernel è danneggiato durante l'invio o la rimozione delle eccezioni (ad esempio a causa del danneggiamento dello stack di un puntatore di frame) o che un driver è in esecuzione fuori da uno stack che non è uno stack di kernel legale.

Importante

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

parametri EXCEPTION_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, rappresenta la stima migliore del kernel per il tipo di stack del kernel che deve essere attivo in base allo stato del computer.

Tipo di limite dello stack:

  • 0x0 - Stack di controllo dei bug (qualsiasi stack se i limiti dello stack vengono calcolati durante il controllo dei bug)
  • 0x1 - Stack DPC del processore
  • 0x2 - Stack KeExpandKernelStackAndCallout(Ex)
  • 0x3 - Stack di thread del kernel normale
  • 0x4 - Stack di thread kernel durante lo scambio del contesto del thread (ambiguo che è attivo)
  • 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 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 di cui è stato eseguito l'annullamento (o inviato per un'eccezione) quando è stato rilevato lo stack non valido.

4

Fornisce un record di eccezione che rappresenta l'eccezione attiva inviata.

Causa

Si è verificato un tentativo di accesso a uno stack non valido. Poiché lo stack del kernel è limitato di dimensioni, lo sviluppatore deve prestare attenzione al rilevamento dei limiti, ad esempio quando viene usato per copiare blocchi di memoria video. Per informazioni sullo stack del kernel di Windows, vedere Uso dello stack del 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 non corretto 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 e il nome del modulo di errore, se disponibili.

Arguments:
Arg1: 00000018940ffbe8
Arg2: 0000000000000003
Arg3: ffffe301c8db2900
Arg4: ffffdc0e9ee665d8

Usare il collegamento al comando .trap fornito nell'output !analyze per impostare il contesto sul fotogramma trap.

2: kd> .trap 0xffffdc0e9ee66680
NOTE: The trap frame does not contain all registers.
Some register values may be zeroed or incorrect.
rax=003f8b813f20b6e0 rbx=0000000000000000 rcx=ee7defdd9c530000
rdx=ffffcb81660ea078 rsi=0000000000000000 rdi=0000000000000000
rip=fffff8002b7f8933 rsp=ffffdc0e9ee66810 rbp=ffffcb81511c3010
 r8=0000000000000001  r9=0000000000004014 r10=ffffdc0e9ee66910
r11=0000000000000000 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0         nv up ei pl zr na po nc
dxgmms2!RemoveHeadList+0xd [inlined in dxgmms2!VidSchiSignalRegisteredSyncObjects+0x3f]:
fffff800`2b7f8933 48395808        cmp     qword ptr [rax+8],rbx ds:003f8b81`3f20b6e8=????????????????

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

0: kd> !vm

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

...

Kernel Stacks:              13686 (      54744 Kb)

Questa quantità di memoria usata è inferiore a quella disponibile in questo esempio.

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

2: kd> !thread
THREAD ffffcb816348b040  Cid 0c58.4a1c  Teb: 0000000000000000 Win32Thread: 0000000000000000 RUNNING on processor 2
Not impersonating
DeviceMap                 ffff840f38c04170
Owning Process            ffffcb81648980c0       Image:         YourPhone.exe
Attached Process          N/A            Image:         N/A
Wait Start TickCount      34501403       Ticks: 0
Context Switch Count      43             IdealProcessor: 3             
UserTime                  00:00:00.000
KernelTime                00:00:00.015
Win32 Start Address 0x00007fff34656d00
Stack Init ffffdc0e9ee675b0 Current ffffdc0e9ee66610
Base ffffdc0e9ee68000 Limit ffffdc0e9ee61000 Call 0000000000000000
Priority 8 BasePriority 8 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        40 ffffdc0e`9ee66850 fffff800`2b7f8801     dxgmms2!VidSchiMarkDeviceAsError+0x4d  
...

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 ffffdc0e`9ee66850 l10
ffffdc0e`9ee66850 1030            adc     byte ptr [rax],dh
ffffdc0e`9ee66852 1c51            sbb     al,51h
ffffdc0e`9ee66854 81cbffffc068    or      ebx,68C0FFFFh
ffffdc0e`9ee6685a e69e            out     9Eh,al
ffffdc0e`9ee6685c 0e              ???
ffffdc0e`9ee6685d dcff            fdiv    st(7),st
ffffdc0e`9ee6685f ff00            inc     dword ptr [rax]
ffffdc0e`9ee66861 0000            add     byte ptr [rax],al
ffffdc0e`9ee66863 0000            add     byte ptr [rax],al
ffffdc0e`9ee66865 0000            add     byte ptr [rax],al
ffffdc0e`9ee66867 000e            add     byte ptr [rsi],cl
ffffdc0e`9ee66869 0000            add     byte ptr [rax],al
ffffdc0e`9ee6686b 0000            add     byte ptr [rax],al
ffffdc0e`9ee6686d 0000            add     byte ptr [rax],al
ffffdc0e`9ee6686f 0010            add     byte ptr [rax],dl
ffffdc0e`9ee66871 301c51          xor     byte ptr [rcx+rdx*2],bl

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

2: kd> .cxr ffffe301c8db2900
rax=003f8b813f20b6e0 rbx=ffffcb813f607650 rcx=ee7defdd9c530000
rdx=ffffcb81660ea078 rsi=0000000000000000 rdi=ffffcb81511c30a8
rip=fffff8002b7f8933 rsp=ffffdc0e9ee66810 rbp=ffffcb81511c3010
 r8=0000000000000001  r9=0000000000004014 r10=ffffdc0e9ee66910
r11=0000000000000000 r12=ffffdc0e9ee66910 r13=ffffcb814019c000
r14=0000000000000000 r15=ffffdc0e9ee66910
iopl=0         nv up ei pl zr na po nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00050246
dxgmms2!RemoveHeadList+0xd [inlined in dxgmms2!VidSchiSignalRegisteredSyncObjects+0x3f]:
fffff800`2b7f8933 48395808        cmp     qword ptr [rax+8],rbx ds:002b:003f8b81`3f20b6e8=????????????????

Usare il comando .exr (Display Exception Record) per visualizzare il record di eccezione, usando il valore del parametro 4 fornito da !analyze.

2: kd> .exr ffffdc0e9ee665d8
ExceptionAddress: fffff8002b7f8933 (dxgmms2!RemoveHeadList+0x000000000000000d)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 0000000000000000
   Parameter[1]: ffffffffffffffff
Attempt to read from address ffffffffffffffff

Il record di eccezione indica un tentativo di lettura da e dell'indirizzo di ffffffffffffffff, che sarebbe un'area da analizzare ulteriormente.

Vedi anche

Riferimento al codice del controllo errori