錯誤檢查0x1AB:UNWIND_ON_INVALID_STACK
UNWIND_ON_INVALID_STACK錯誤檢查的值為 0x000001AB。 它表示嘗試存取有效核心堆疊範圍以外的記憶體。 特別是,這個 BugCheck 表示堆疊回溯跨越到不正確核心堆疊。 這可能表示核心堆疊指標在例外狀況分派或回溯 (期間已損毀,例如,因為框架指標) 堆疊損毀,或驅動程式在不是合法核心堆疊的堆疊上執行。
發生不正確存取權時,例外狀況記錄無法使用。
重要
本文適用于程式設計人員。 如果您是在使用電腦時收到藍色螢幕錯誤碼的客戶,請參閱 針對藍色畫面錯誤進行疑難排解。
UNWIND_ON_INVALID_STACK參數
參數 | 描述 |
---|---|
1 |
目前堆疊的指標。 |
2 |
Stack 限制的類型,例如 NormalStackLimits (3) 。 因為堆疊無效,所以這代表核心的最佳估計,也就是應該在電腦狀態下作用中的核心堆疊類型。 堆疊限制類型:
|
3 |
內容記錄的指標,代表遇到無效堆疊時,發生例外狀況 (或分派給例外狀況) 的內容。 |
4 |
ExceptionRecord - 保留且一律為 0 供UNWIND_ON_INVALID_STACK使用。 |
原因
嘗試存取不正確堆疊。 由於核心堆疊的大小有限,開發人員必須小心追蹤其限制,例如使用它來複製視訊記憶體區塊時。 如需 Windows 核心堆疊的相關資訊,請參閱 使用核心堆疊。
解決方案
使用完整核心傾印或附加偵錯工具時,下列命令可能有助於收集資訊,並追蹤不正確地存取記憶體的程式碼。
首先,使用 !analyze 命令來收集資訊,特別是錯誤檢查參數。 如果可用,也請檢查錯誤的來源行和模組名稱。
Arguments:
Arg1: 89344350fffff607
Arg2: 0000000000000003
Arg3: fffff607893436c4
Arg4: fffff60789343ea8
使用 !analyze 輸出中提供的 .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 (顯示堆疊回溯) 搭配 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 (顯示內容記錄) 命令,使用 !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 參數來檢視堆疊的相關資訊。 此命令可能需要一些時間才能執行。 檢查輸出中是否有可能指向 和 區域進行進一步調查的重複執行模式。