バグ チェック 0x1AA: EXCEPTION_ON_INVALID_STACK

EXCEPTION_ON_INVALID_STACK バグ チェックには、0x000001AA の値があります。 この BugCheck は、例外ディスパッチが無効なカーネル スタックに渡されたことを示します。 これは、例外のディスパッチやアンワインド中にカーネル スタック ポインターが破損したか (フレーム ポインターのスタック破損など)、ドライバーが正規のカーネル スタックではないスタックから実行されていることを示します。

重要

このトピックはプログラマー向けです。 コンピューターの使用中にこのエラー コードを受け取った場合は、「ブルー スクリーン エラーのトラブルシューティング」を参照してください。

EXCEPTION_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

ディスパッチされていたアクティブな例外を表す例外レコードを指定します。

原因

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

解決方法

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

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

Arguments:
Arg1: 00000018940ffbe8
Arg2: 0000000000000003
Arg3: ffffe301c8db2900
Arg4: ffffdc0e9ee665d8

!analyze 出力で指定された .trap コマンド リンクを使用して、トラップ フレームにコンテキストを設定します。

2: kd> .trap 0xffffdc0e9ee66680
NOTE: The trap frame does not contain all registers.
Some register values may be zeroed or incorrect.
rax=003f8b813f20b6e0 rbx=0000000000000000 rcx=ee7defdd9c530000
rdx=ffffcb81660ea078 rsi=0000000000000000 rdi=0000000000000000
rip=fffff8002b7f8933 rsp=ffffdc0e9ee66810 rbp=ffffcb81511c3010
 r8=0000000000000001  r9=0000000000004014 r10=ffffdc0e9ee66910
r11=0000000000000000 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0         nv up ei pl zr na po nc
dxgmms2!RemoveHeadList+0xd [inlined in dxgmms2!VidSchiSignalRegisteredSyncObjects+0x3f]:
fffff800`2b7f8933 48395808        cmp     qword ptr [rax+8],rbx ds:003f8b81`3f20b6e8=????????????????

!vm コマンドを使用してメモリ使用量 (例: カーネル スタック メモリの使用量) を調べます。

0: kd> !vm

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

...

Kernel Stacks:              13686 (      54744 Kb)

この例では、メモリ使用量が使用可能な量より少なくなります。

!thread コマンドを使用して、実行中の情報を収集します。 この例では、ビデオ スケジューラ ワーカー スレッドが実行されているようです。

2: kd> !thread
THREAD ffffcb816348b040  Cid 0c58.4a1c  Teb: 0000000000000000 Win32Thread: 0000000000000000 RUNNING on processor 2
Not impersonating
DeviceMap                 ffff840f38c04170
Owning Process            ffffcb81648980c0       Image:         YourPhone.exe
Attached Process          N/A            Image:         N/A
Wait Start TickCount      34501403       Ticks: 0
Context Switch Count      43             IdealProcessor: 3             
UserTime                  00:00:00.000
KernelTime                00:00:00.015
Win32 Start Address 0x00007fff34656d00
Stack Init ffffdc0e9ee675b0 Current ffffdc0e9ee66610
Base ffffdc0e9ee68000 Limit ffffdc0e9ee61000 Call 0000000000000000
Priority 8 BasePriority 8 PriorityDecrement 0 IoPriority 2 PagePriority 5
...

次に、kb (Display Stack Backtrace) を f オプションと併用してスタックとメモリ使用量を表示し、大きなメモリ ユーザーが存在するかどうかを確認します。

2: kd> kf
...
02        40 ffffdc0e`9ee66850 fffff800`2b7f8801     dxgmms2!VidSchiMarkDeviceAsError+0x4d  
...

コードの特定の部分が疑わしい場合は、u、ub、uu (組み立て) コマンドを使用して、関連するアセンブリ言語コードを調べます。

2: kd> u ffffdc0e`9ee66850 l10
ffffdc0e`9ee66850 1030            adc     byte ptr [rax],dh
ffffdc0e`9ee66852 1c51            sbb     al,51h
ffffdc0e`9ee66854 81cbffffc068    or      ebx,68C0FFFFh
ffffdc0e`9ee6685a e69e            out     9Eh,al
ffffdc0e`9ee6685c 0e              ???
ffffdc0e`9ee6685d dcff            fdiv    st(7),st
ffffdc0e`9ee6685f ff00            inc     dword ptr [rax]
ffffdc0e`9ee66861 0000            add     byte ptr [rax],al
ffffdc0e`9ee66863 0000            add     byte ptr [rax],al
ffffdc0e`9ee66865 0000            add     byte ptr [rax],al
ffffdc0e`9ee66867 000e            add     byte ptr [rsi],cl
ffffdc0e`9ee66869 0000            add     byte ptr [rax],al
ffffdc0e`9ee6686b 0000            add     byte ptr [rax],al
ffffdc0e`9ee6686d 0000            add     byte ptr [rax],al
ffffdc0e`9ee6686f 0010            add     byte ptr [rax],dl
ffffdc0e`9ee66871 301c51          xor     byte ptr [rcx+rdx*2],bl

.cxr (Display Context Record) コマンドを使用して、!analyze が指定するパラメーター 3 の値を使用してコンテキスト レコードを表示します。

2: kd> .cxr ffffe301c8db2900
rax=003f8b813f20b6e0 rbx=ffffcb813f607650 rcx=ee7defdd9c530000
rdx=ffffcb81660ea078 rsi=0000000000000000 rdi=ffffcb81511c30a8
rip=fffff8002b7f8933 rsp=ffffdc0e9ee66810 rbp=ffffcb81511c3010
 r8=0000000000000001  r9=0000000000004014 r10=ffffdc0e9ee66910
r11=0000000000000000 r12=ffffdc0e9ee66910 r13=ffffcb814019c000
r14=0000000000000000 r15=ffffdc0e9ee66910
iopl=0         nv up ei pl zr na po nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00050246
dxgmms2!RemoveHeadList+0xd [inlined in dxgmms2!VidSchiSignalRegisteredSyncObjects+0x3f]:
fffff800`2b7f8933 48395808        cmp     qword ptr [rax+8],rbx ds:002b:003f8b81`3f20b6e8=????????????????

.exr (Display Exception Record) コマンドを使用して、!analyze が指定するパラメーター 4 の値を使用して例外レコードを表示します。

2: kd> .exr ffffdc0e9ee665d8
ExceptionAddress: fffff8002b7f8933 (dxgmms2!RemoveHeadList+0x000000000000000d)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 0000000000000000
   Parameter[1]: ffffffffffffffff
Attempt to read from address ffffffffffffffff

例外レコードは、読み取りと ffffffffffffffff アドレスの試行を示します。これは、さらに調査が必要な領域です。

参照

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