Comprobación de errores 0x1AB: UNWIND_ON_INVALID_STACK

La comprobación de errores UNWIND_ON_INVALID_STACK tiene un valor de 0x000001AB. Indica que se intentó acceder a la memoria fuera del intervalo de pila de kernel válido. En concreto, este BugCheck indica que el desenredado de pila se cruza 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.

En el momento en que se produjo el acceso no válido, el registro de excepción no estaba disponible.

Importante

Este artículo es para programadores. Si es un cliente que ha recibido un código de error de pantalla azul mientras usa el equipo, consulte Solución de errores de pantalla azul.

parámetros de UNWIND_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

ExceptionRecord: reservado y siempre 0 para UNWIND_ON_INVALID_STACK.

Causa

Error al intentar acceder a una pila no válida. Dado que la pila del kernel tiene un tamaño limitado, el desarrollador debe tener cuidado con el seguimiento de los límites, por ejemplo, al usarlo 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: 89344350fffff607
Arg2: 0000000000000003
Arg3: fffff607893436c4
Arg4: fffff60789343ea8

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

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

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

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

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

Use el comando .cxr (Mostrar registro de contexto) para mostrar el registro de contexto mediante el valor del parámetro 3 proporcionado por !analyze.

.cxr fffff607893436c4

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)

Use el comando !stacks , con el parámetro 2 para ver información sobre las pilas. Este comando puede tardar algún tiempo en ejecutarse. Examine la salida de los patrones repetidos de ejecución bloqueada que pueden apuntar hacia y el área para una investigación más detallada.

Consulte también

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