Comprobación de errores 0x1AA: EXCEPTION_ON_INVALID_STACK

La comprobación de errores EXCEPTION_ON_INVALID_STACK tiene un valor de 0x000001AA. Esta comprobación de errores indica que la excepción se ha cruzado en una pila de kernel no válida. Esto puede indicar que el puntero de pila del kernel se ha dañado durante el envío o desenredado de excepciones (por ejemplo, debido a daños en la pila de un puntero de marco) o que un controlador se está ejecutando fuera de una pila que no es una pila de kernel legal.

Importante

Este tema está destinado a los programadores. Si es un cliente que ha recibido este código de error mientras usa el equipo, consulte Solución de errores de pantalla azul.

parámetros de EXCEPTION_ON_INVALID_STACK

Parámetro Descripción

1

Puntero a la pila actual.

2

Tipo de límite de pila, como NormalStackLimits (3). Dado que la pila no es válida, representa la mejor estimación del kernel en cuanto al tipo de pila del kernel que debe estar activa según el estado de la máquina.

Tipo de límite de pila:

  • 0x0: pila de comprobación de errores (cualquier pila si los límites de pila se calculan durante el tiempo de comprobación de errores)
  • 0x1: pila DPC del procesador
  • 0x2: pila KeExpandKernelStackAndCallout(Ex)
  • 0x3: pila de subprocesos de kernel normal
  • 0x4: pila de subprocesos de kernel durante el intercambio de contexto de subproceso (ambiguo qué subproceso está activo)
  • 0x5: pila de llamadas de usuario o kernel win32k
  • 0x6: pila de ISR de procesador
  • 0x7: pila del depurador de kernel (cualquier pila cuando el depurador de kernel controla la E/S de KD)
  • 0x8: pila de control de NMI de procesador
  • 0x9: pila de control de comprobación de la máquina del procesador
  • 0xA: pila de excepciones de procesador (que se usa para enviar determinadas excepciones IRQL generadas)

3

Puntero al registro de contexto que representa el contexto que se estaba desenlazando (o se envió para una excepción) cuando se encontró la pila no válida.

4

Proporciona un registro de excepción que representa la excepción activa que se estaba enviando.

Causa

Error al intentar acceder a una pila no válida. Como una pila de kernel tiene un tamaño limitado, el desarrollador debe tener cuidado con el seguimiento de los límites, por ejemplo, cuando se usa para copiar bloques de memoria de vídeo. Para obtener información sobre la pila de kernels de Windows, consulte Uso de la pila de kernels.

Resolución

Con un volcado de kernel completo o un depurador adjunto, los siguientes comandos pueden ser útiles para recopilar información y realizar un seguimiento del código que tiene acceso incorrecto a la memoria.

En primer lugar, use el comando !analyze para recopilar información, en particular los parámetros de comprobación de errores. Examine también la línea de origen y el nombre del módulo de error, si está disponible.

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

Use el vínculo de comando .trap proporcionado en la salida !analyze para establecer el contexto en el marco de captura.

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 el comando !vm para examinar el uso de memoria, por ejemplo, para ver la cantidad de memoria de las pilas de kernel en uso.

0: kd> !vm

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

...

Kernel Stacks:              13686 (      54744 Kb)

Esta cantidad de memoria usada es menor y está disponible en este ejemplo.

Use el comando !thread para recopilar información sobre lo que se está ejecutando. En este ejemplo, parece que se está ejecutando un subproceso de trabajo del programador de vídeo.

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

A continuación, use kb (Display Stack Backtrace) con la opción f para mostrar la pila y el uso de memoria para ver si hay un usuario de memoria grande.

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

Si una parte específica del código parece sospechosa, use el comando u, ub, uu (Unassemble) para examinar el código de lenguaje de ensamblado asociado.

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 el comando .cxr (Mostrar registro de contexto) para mostrar el registro de contexto mediante el valor del parámetro 3 proporcionado 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 el comando .exr (Mostrar registro de excepciones) para mostrar el registro de excepción mediante el parámetro 4 que proporciona !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

El registro de excepción indica un intento de leer desde y la dirección de ffffffffffffffff, que sería un área para investigar más.

Consulte también

Bug Check Code Reference (Referencia de código de comprobación de errores)