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:
|
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)