Bagikan melalui


0x1AB Pemeriksaan Bug: UNWIND_ON_INVALID_STACK

Pemeriksaan bug UNWIND_ON_INVALID_STACK memiliki nilai 0x000001AB. Ini menunjukkan bahwa upaya dilakukan untuk mengakses memori di luar rentang tumpukan kernel yang valid. Secara khusus, BugCheck ini menunjukkan bahwa tumpukan unwinding disilangkan ke tumpukan kernel yang tidak valid. Ini mungkin menunjukkan bahwa penunjuk tumpukan kernel telah rusak selama pengiriman pengecualian atau melepas lelah (misalnya karena kerusakan tumpukan penunjuk bingkai), atau bahwa driver mengeksekusi dari tumpukan yang bukan tumpukan kernel hukum.

Pada saat akses tidak valid terjadi, rekaman pengecualian tidak tersedia.

Penting

Artikel ini untuk programmer. Jika Anda adalah pelanggan yang telah menerima kode kesalahan layar biru saat menggunakan komputer Anda, lihat Memecahkan masalah kesalahan layar biru.

Parameter UNWIND_ON_INVALID_STACK

Parameter Deskripsi

1

Penunjuk ke tumpukan saat ini.

2

Jenis batas tumpukan seperti NormalStackLimits (3). Karena tumpukan tidak valid, ini mewakili estimasi terbaik kernel tentang jenis tumpukan kernel yang harus aktif mengingat status komputer.

Jenis batas tumpukan:

  • 0x0 - Tumpukan bugcheck (tumpukan apa pun jika batas tumpukan dihitung selama waktu pemeriksaan bug)
  • 0x1 - Tumpukan DPC prosesor
  • 0x2 - Tumpukan KeExpandKernelStackAndCallout(Ex)
  • 0x3 - Tumpukan utas kernel normal
  • 0x4 - Tumpukan utas kernel selama pertukaran konteks utas (ambigu utas mana yang aktif)
  • 0x5 - Tumpukan callout win32k kernel/pengguna
  • 0x6 - Tumpukan ISR prosesor
  • 0x7 - Tumpukan debugger Kernel (tumpukan apa pun saat debugger kernel menangani KD I/O)
  • 0x8 - Tumpukan penanganan NMI prosesor
  • 0x9 - Tumpukan penanganan pemeriksaan mesin prosesor
  • 0xA - Tumpukan pengecualian prosesor (digunakan untuk mengirimkan pengecualian IRQL tertentu yang dinaikkan)

3

Penunjuk ke rekaman konteks yang mewakili konteks yang tidak digunakan (atau dikirim untuk pengecualian) ketika tumpukan yang tidak valid ditemui.

4

ExceptionRecord - Dicadangkan dan selalu 0 untuk UNWIND_ON_INVALID_STACK.

Penyebab

Terjadi upaya untuk mengakses tumpukan yang tidak valid. Karena ukuran tumpukan kernel terbatas, pengembang harus berhati-hati dengan melacak batasannya, misalnya saat menggunakannya untuk menyalin blok memori video. Untuk informasi tentang tumpukan Kernel Windows, lihat Menggunakan Tumpukan Kernel.

Resolusi

Menggunakan cadangan kernel penuh atau debugger terlampir, perintah berikut mungkin berguna untuk mengumpulkan informasi dan melacak kode yang salah mengakses memori.

Pertama gunakan perintah !analyze untuk mengumpulkan informasi, khususnya parameter pemeriksaan bug. Periksa juga baris sumber dan nama modul yang rusak, jika tersedia.

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

Gunakan tautan perintah .trap yang disediakan dalam !analyze output untuk mengatur konteks ke bingkai 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

Gunakan perintah !thread untuk mengumpulkan informasi tentang apa yang sedang berjalan. Dalam contoh ini, sepertinya utas pekerja penjadwal video sedang berjalan.

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

Kemudian gunakan kb (Display Stack Backtrace) dengan opsi f untuk menampilkan tumpukan dan penggunaan memori untuk melihat apakah ada pengguna memori besar.

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

Jika bagian tertentu dari kode terlihat mencurigakan, gunakan perintah u, ub, uu (Unassemble) untuk memeriksa kode bahasa rakit terkait.

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]

Gunakan perintah .cxr (Rekaman Konteks Tampilan) untuk menampilkan rekaman konteks, menggunakan nilai parameter 3 yang disediakan oleh !analyze.

.cxr fffff607893436c4

Gunakan perintah !vm untuk memeriksa penggunaan memori, misalnya untuk melihat berapa banyak memori Tumpukan Kernel yang digunakan.

0: kd> !vm

Physical Memory:          1541186 (    6164744 Kb)
Available Pages:           470550 (    1882200 Kb)
ResAvail Pages:           1279680 (    5118720 Kb)

...

Kernel Stacks:              13686 (      54744 Kb)

Gunakan perintah !stacks , dengan parameter 2 untuk melihat informasi tentang tumpukan. Perintah ini mungkin membutuhkan waktu untuk dijalankan. Periksa output untuk pola berulang eksekusi yang diblokir yang dapat menunjuk ke arah dan area untuk penyelidikan lebih lanjut.

Lihat juga

Referensi Bug Check Code