Partilhar via


Verificação de bug 0x1AA: EXCEPTION_ON_INVALID_STACK

A verificação de bug EXCEPTION_ON_INVALID_STACK tem um valor de 0x000001AA. Esta BugCheck indica que a expedição de exceção cruzou uma pilha de kernel inválida. Isso pode indicar que o ponteiro da pilha do kernel foi corrompido durante a expedição ou o desenrolamento da exceção (por exemplo, devido à corrupção da pilha de um ponteiro de quadro) ou que um driver está sendo executado fora de uma pilha que não é uma pilha de kernel legal.

Importante

Este tópico é para programadores. Se você for um cliente que recebeu esse código de erro enquanto estava usando o computador, confira Solucionar problemas de erros de tela azul.

Parâmetros de EXCEPTION_ON_INVALID_STACK

Parâmetro Descrição

1

Um ponteiro para a pilha atual.

2

O Tipo de limite de pilha, como NormalStackLimits (3). Como a pilha é inválida, isso representa a melhor estimativa do kernel quanto ao tipo de pilha do kernel que deve estar ativa, considerando o estado do computador.

Tipo de limite de pilha:

  • 0x0 - Pilha de verificação de bug (qualquer pilha se os limites de pilha forem computados durante o tempo de verificação de bug)
  • 0x1 - Uma pilha DPC do processador
  • 0x2 - Uma pilha KeExpandKernelStackAndCallout(Ex)
  • 0x3 - Uma pilha normal de threads de kernel
  • 0x4 - Uma pilha de threads do kernel durante a troca de contexto de thread (é ambíguo qual thread está ativo)
  • 0x5 - Uma pilha de texto explicativo do kernel/usuário de win32k
  • 0x6 - Uma pilha ISR do processador
  • 0x7 - Pilha do depurador do kernel (qualquer pilha quando o depurador do kernel está lidando com a E/S KD)
  • 0x8 - Uma pilha de tratamento de NMI do processador
  • 0x9 - Uma pilha de tratamento de verificação de máquina do processador
  • 0xA - Uma pilha de exceções do processador (usada para expedir certas exceções de IRQL aumentadas)

3

Um ponteiro para o registro de contexto que representa o contexto que estava sendo desenrolado (ou expedido para uma exceção) quando a pilha inválida foi encontrada.

4

Fornece um registro de exceção que representa a exceção ativa que estava sendo expedida.

Causa

Ocorreu uma tentativa de acessar uma pilha inválida. Como uma pilha de kernel tem limite de tamanho, o desenvolvedor precisa estar atento para controlar seus limites; por exemplo, ao usá-la para copiar blocos de memória de vídeo. Para obter informações sobre a pilha de Kernel do Windows, confira Usar a pilha de kernel.

Resolução

Usando um despejo de kernel completo ou um depurador anexado, os comandos a seguir podem ser úteis para coletar informações e rastrear o código que está acessando incorretamente a memória.

Primeiro, use o comando !analyze para coletar informações, principalmente os parâmetros de verificação de bug. Examine também a linha de origem com falha e o nome do módulo, se disponível.

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

Use o link de comando .trap fornecido na saída !analyze para definir o contexto para o quadro de interceptação.

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=????????????????

Use o comando !vm para examinar o uso de memória, por exemplo, para ver a quantidade de memória de Pilhas de Kernel que está sendo usada.

0: kd> !vm

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

...

Kernel Stacks:              13686 (      54744 Kb)

Essa quantidade de memória usada é menor do que a disponível neste exemplo.

Use o comando !thread para coletar informações sobre o que está sendo executado. Neste exemplo, parece que um thread de trabalho do agendador de vídeo está em execução.

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
...

Em seguida, use kb (Exibir Backtrace de Pilha) com a opção f para exibir a pilha e o uso de memória para ver se há um usuário de memória grande.

2: kd> kf
...
02        40 ffffdc0e`9ee66850 fffff800`2b7f8801     dxgmms2!VidSchiMarkDeviceAsError+0x4d  
...

Se uma parte específica do código parecer suspeita, use o comando u, ub, uu (Desmontar) para examinar o código de linguagem assembly associado.

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

Use o comando .cxr (Exibir Registro de Contexto) para exibir o registro de contexto, usando o valor de parâmetro 3 fornecido por !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=????????????????

Use o comando .exr (Exibir Registro de Exceção) para exibir o registro de exceção, usando o valor de parâmetro 4 fornecido por !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

O registro de exceção indica uma tentativa de ler do endereço de ffffffffffffffff, que seria uma área a ser investigada mais detalhadamente.

Confira também

Referência de código de verificação de bugs