バグ チェック 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 I/O を処理している場合のスタック)
  • 0x8 - プロセッサ NMI 処理スタック
  • 0x9 - プロセッサ マシン チェック処理スタック
  • 0xA - プロセッサ例外スタック (発生した特定の IRQL 例外をディスパッチするために使用)

3

無効なスタックが検出されたときに巻き戻された (または例外に対してディスパッチされた) コンテキストを表すコンテキスト レコードへのポインター。

4

ExceptionRecord - 予約済みで、UNWIND_ON_INVALID_STACKの場合は常に 0。

原因

無効なスタックへのアクセス試行。 カーネル スタックのサイズが制限されているため、開発者は、ビデオ メモリのブロックをコピーするために使用する場合など、制限を追跡するように注意する必要があります。 Windows カーネル スタックの詳細については、「カーネル スタックの使用」を参照してください。

解決方法

完全なカーネル ダンプまたはアタッチされたデバッガーを使用すると、次のコマンドを使用して情報を収集し、メモリに誤ってアクセスしているコードを追跡するのに役立つ場合があります。

最初に !analyze コマンドを使用して情報を収集し、特に bug check パラメータを収集します。 また、障害が発生しているソース行とモジュール名 (使用可能な場合) も調べます。

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 (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 (組み立て) コマンドを使用して、関連するアセンブリ言語コードを調べます。

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 パラメーターを使用して、スタックに関する情報を表示します。 このコマンドの実行には、少し時間がかかる場合があります。 ブロックされた回が繰り返されるパターンがないか出力を調査し、さらなる調査が必要な領域を示す可能性を調べます。

参照

バグ チェック コード リファレンス