错误检查 0x1AB:UNWIND_ON_INVALID_STACK
UNWIND_ON_INVALID_STACK 错误检查的值为 0x000001AB。 它表明在试图访问有效内核堆栈范围之外的内存。 具体而言,此 BugCheck 表明堆栈展开越过了无效的内核堆栈。 这可能表明内核堆栈指针在异常调度或展开期间已损坏(例如,由于帧指针的堆栈损坏),或者驱动程序正在一个不合法的内核堆栈上执行。
发生无效访问时,异常记录不可用。
重要
这篇文章适合程序员阅读。 如果您是在使用计算机时收到蓝屏错误代码的客户,请参阅蓝屏错误疑难解答。
UNWIND_ON_INVALID_STACK 参数
参数 | 说明 |
---|---|
1 |
指向当前堆栈的指针。 |
2 |
堆栈限制类型,如 NormalStackLimits (3)。 由于堆栈无效,这代表了内核对计算机状态下应激活的内核堆栈类型的最佳估计。 堆栈限制类型:
|
3 |
指向上下文记录的指针,表示在遇到无效堆栈时正在展开(或为异常调度)的上下文。 |
4 |
ExceptionRecord - 为 UNWIND_ON_INVALID_STACK 保留并始终为 0。 |
原因
尝试访问无效堆栈。 由于内核堆栈的大小有限,因此开发人员需要谨慎跟踪其限制,例如在使用它来复制显存块时。 有关 Windows 内核堆栈的信息,请参阅使用内核堆栈。
解决方法
使用完整的内核转储或附加的调试器,以下命令可能有助于收集信息并跟踪错误访问内存的代码。
首先使用 !analyze 命令来收集信息,特别是错误检查参数。 如果有,还可检查故障源行和模块名称。
Arguments:
Arg1: 89344350fffff607
Arg2: 0000000000000003
Arg3: fffff607893436c4
Arg4: fffff60789343ea8
使用分析输出中提供的 .trap 命令链接,将上下文设置为陷阱帧。
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
使用 !thread 命令来收集有关正在运行的内容的信息。 在本例中,视频计划程序工作线程似乎正在运行。
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
...
然后使用 kb (Display Stack Backtrace) 和 f 选项来显示堆栈和内存使用情况,以查看是否存在大内存用户。
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
...
如果代码的某一部分看起来可疑,请使用 u, ub, uu (Unassemble) 命令来检查相关的汇编语言代码。
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]
使用 .cxr (Display Context Record) 命令,利用 !analyze 提供的参数 3 值来显示上下文记录。
.cxr fffff607893436c4
使用 !vm 命令检查内存使用情况,例如查看正在使用的内核堆栈内存量。
0: kd> !vm
Physical Memory: 1541186 ( 6164744 Kb)
Available Pages: 470550 ( 1882200 Kb)
ResAvail Pages: 1279680 ( 5118720 Kb)
...
Kernel Stacks: 13686 ( 54744 Kb)
使用 !stacks 命令和 2 个参数来查看有关堆栈的信息。 运行该命令可能需要一些时间。 检查输出中是否有重复的执行受阻模式,这些模式可能指向需要进一步调查的领域。