Поделиться через


0x1AB проверки ошибок: UNWIND_ON_INVALID_STACK

Проверка ошибок UNWIND_ON_INVALID_STACK имеет значение 0x000001AB. Это означает, что была предпринята попытка получить доступ к памяти за пределами допустимого диапазона стека ядра. В частности, этот bugCheck указывает, что очистка стека перекрещена в недопустимый стек ядра. Это может означать, что указатель стека ядра поврежден во время отправки исключений или очистки (например, из-за повреждения стека указателя кадра) или что драйвер выполняется вне стека, который не является допустимым стеком ядра.

На момент возникновения недопустимого доступа запись исключения была недоступна.

Важно!

Эта статья предназначена для программистов. Если вы являетесь клиентом, который получил код ошибки "синий экран" во время работы с компьютером, см. статью Устранение ошибок синего экрана.

Параметры UNWIND_ON_INVALID_STACK

Параметр Описание

1

Указатель на текущий стек.

2

Тип ограничения стека, например NormalStackLimits (3). Так как стек недопустим, он представляет наилучшую оценку ядра в качестве типа стека ядра, который должен быть активным, учитывая состояние компьютера.

Тип ограничения стека:

  • 0x0 — стек проверки ошибок (любой стек, если ограничения стека вычисляются во время проверки ошибок)
  • 0x1 — стек DPC процессора
  • 0x2 — стек KeExpandKernelStackAndCallout(Ex)
  • 0x3 — обычный стек потоков ядра
  • 0x4 — стек потоков ядра во время переключения контекста потока (неоднозначность активного потока)
  • 0x5 — стек выносок ядра или пользователя win32k
  • 0x6 — стек ISR процессора
  • 0x7 — стек отладчика ядра (любой стек, когда отладчик ядра обрабатывает KD-ввод-вывод)
  • 0x8 — стек обработки NMI процессора
  • 0x9 — компьютер процессора проверка стек обработки
  • 0xA — стек исключений процессора (используется для отправки определенных вызванных исключений IRQL)

3

Указатель на запись контекста, представляющую контекст, который был развернут (или отправлен для исключения) при обнаружении недопустимого стека.

4

ExceptionRecord — зарезервировано и всегда равно 0 для UNWIND_ON_INVALID_STACK.

Причина

Предпринята попытка доступа к недопустимому стеку. Так как размер стека ядра ограничен, разработчик должен быть осторожным с отслеживанием его ограничений, например при использовании для копирования блоков видеопамяти. Сведения о стеке ядра Windows см. в разделе Использование стека ядра.

Решение

Используя полный дамп ядра или подключенный отладчик, следующие команды могут быть полезны для сбора информации и отслеживания кода, который неправильно обращается к памяти.

Сначала используйте команду !analyze для сбора сведений, в частности об ошибке проверка параметров. Кроме того, проверьте строку источника сбоя и имя модуля, если они доступны.

Arguments:
Arg1: 89344350fffff607
Arg2: 0000000000000003
Arg3: fffff607893436c4
Arg4: fffff60789343ea8

Используйте предоставленную ссылку команды .trap в выходных данных !analyze, чтобы задать контекст для кадра ловушки.

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) для отображения записи контекста, используя значение параметра 3, предоставленное !analyze.

.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 для просмотра сведений о стеках. Выполнение этой команды может занять некоторое время. Изучите выходные данные на наличие повторяющихся шаблонов заблокированного выполнения, которые могут указывать на область и область для дальнейшего изучения.

См. также:

Bug Check Code Reference (Справочник с кодами критических ошибок)