バグ チェック 0x1E: KMODE_EXCEPTION_NOT_HANDLED

KMODE_EXCEPTION_NOT_HANDLED バグ チェックバグ チェックには、0x0000001E の値があります。 バグ チェックは、カーネル モード プログラムがエラー ハンドラーがキャッチしなかった例外を生成したことを示します。

重要

この記事は、プログラマー向けです。 Microsoft のユーザーがお使いのコンピューターでブルー スクリーン エラー コードが表示された場合は、「ブルー スクリーン エラーのトラブルシューティング」を参照してください。

KMODE_EXCEPTION_NOT_HANDLED パラメーター

パラメーター 説明
1 処理されなかった例外コード。
2 例外が発生したアドレス。
3 例外レコードの例外情報パラメーター 0。
4 例外レコードの例外情報パラメーター 0。

原因

このバグ チェックを解釈するには、生成された例外を特定する必要があります。

一般的な例外コードは次のとおりです。

  • 0x80000002: STATUS_DATATYPE_MISALIGNMENT

    未調整データ参照が見つかりました。

  • 0x80000003: STATUS_BREAKPOINT

    カーネル デバッガーがシステムにアタッチされていないときに、ブレークポイントまたはアサートが発生しました。

  • 0xC0000005: STATUS_ACCESS_VIOLATION

    メモリ アクセス違反が発生しました (バグ チェックのパラメーター 4 は、ドライバーからアクセスが試行されたアドレスです)。

例外コードの完全な一覧については、「NTSTATUS 値」を参照してください。 例外コードは、Windows Driver Kit のヘッダー ファイルである ntstatus.h で定義されています。 詳細については、「Windows Driver Kit のヘッダー ファイル」を参照してください。

解説

この問題をデバッグする準備が整っていない場合は、バグ チェックのブルー スクリーン データの分析に関する記述で説明されている基本的なトラブルシューティング手法を使用できます。 バグ チェック メッセージでドライバーがわかる場合は、ドライバーを無効にするか、製造元にドライバーの更新プログラムを確認します。

ハードウェアの非互換性

インストールされた新しいハードウェアが、インストールされている Windows のバージョンと互換性があることを確認します。 たとえば、Windows 10 の仕様で必要なハードウェアに関する情報を取得できます。

デバイス ドライバーまたはシステム サービスの障害

デバイス ドライバーまたはシステム サービスに障害が発生すると、このエラーが発生する可能性があります。 BIOS の非互換性、メモリの競合、IRQ の競合などのハードウェアの問題でも、このエラーが発生する可能性があります。

バグ チェック メッセージにドライバーが名前で表示されている場合は、そのドライバーを無効にするか、削除します。 最近追加されたドライバーまたはサービスを無効化または削除します。 スタートアップ シーケンス中にエラーが発生し、システム パーティションが NTFS ファイル システムを使用してフォーマットされている場合は、セーフ モードを使用してデバイス マネージャーでドライバーを無効にできる可能性があります。

イベント ビューアーのシステム ログで、バグ チェック 0x1E の原因になっているデバイスまたはドライバーの特定に役立つ可能性がある追加のエラー メッセージを調べます。 また、システムの製造元 (特にメモリ スキャナー) によって提供されるハードウェア診断も実行します。 これらのトラブルシューティング手順の詳細については、コンピューターの所有者のマニュアルを参照してください。

このメッセージを生成するエラーは、Windows セットアップ中の最初の再起動後、またはセットアップの完了後に発生する可能性があります。 エラーの原因として考えられるのは、システム BIOS の非互換性です。 システム BIOS のバージョンをアップグレードすることで、BIOS の問題を解決できます。

解決方法

この問題をデバッグするときにスタック トレースを取得するのが難しい場合があります。 例外アドレス (パラメーター 2) は、問題の原因となったドライバーまたは関数を識別する必要があります。

例外コード 0x80000003は、ハードコーディングされたブレークポイントまたはアサーションにヒットしたが、システムが /NODEBUG スイッチで開始されたことを示します。 この問題はあまり発生しません。 繰り返し発生する場合は、カーネル デバッガーが接続されていること、およびシステムが /DEBUG スイッチで起動されていることを確認します。

例外コード 0x80000002 が発生した場合、トラップ フレームは詳細情報を提供します。

不明な原因

例外の特定の原因が不明な場合は、次の手順を使用してスタック トレースを取得することを検討してください。

Note

この手順では、NT!PspUnhandledExceptionInSystemThread の場所を検索できることを前提としています。 しかし、場合によっては、アクセス違反のクラッシュのように NT!PspUnhandledExceptionInSystemThread を見つけることができません。 その場合は、ntoskrnl!KiDispatchException を探します。 この関数に渡される 3 番目のパラメーターは、トラップ フレーム アドレスです。 このアドレスで .trap (ディスプレイ トラップ フレーム) コマンドを使用して、レジスター コンテキストを正しい値に設定します。 その後、スタック トレースを実行し、他のコマンドを発行できます。

スタック トレースを取得する

通常のスタック トレース プロシージャが失敗した場合にスタック トレースを取得するには:

  1. スタック トレースのパラメーターを表示するには、kb (スタック バックトレースの表示) コマンドを使用します。 NT!PspUnhandledExceptionInSystemThread への呼び出しを探します。 (この関数が一覧にない場合は、前の注意を参照してください)。

  2. NT!PspUnhandledExceptionInSystemThread への最初のパラメーターは構造体へのポインターです。 ポインターには、except ステートメントへのポインターが含まれています。

    typedef struct _EXCEPTION_POINTERS {
        PEXCEPTION_RECORD ExceptionRecord;
        PCONTEXT ContextRecord;
        } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
    
    ULONG PspUnhandledExceptionInSystemThread(
        IN PEXCEPTION_POINTERS ExceptionPointers
        )
    

    必要なデータを表示するには、 そのアドレスで dd (display memory) コマンドを使用します。

  3. 最初に取得された値は例外レコードです。 例外レコードの場合は、.exr (例外レコードの 表示) コマンドを使用します。

    2 番目の値はコンテキスト レコードです。 コンテキスト レコードの場合は、.cxr (コンテキスト レコードの表示) コマンドを使用します。

  4. .cxr コマンドの実行後、kb コマンドを使用して、コンテキスト レコード情報に基づくスタック トレースを表示します。 このスタック トレースは、処理されない例外が発生した呼び出し元スタックを示します。

バグ チェックの例

次の例は、x86 プロセッサのバグ チェック 0x1Eを示しています。

kd> .bugcheck                 get the bug check data
Bugcheck code 0000001e
Arguments c0000005 8013cd0a 00000000 0362cffff

kd> kb                        start with a stack trace 
FramePtr  RetAddr   Param1   Param2   Param3   Function Name 
8013ed5c  801263ba  00000000 00000000 fe40cb00 NT!_DbgBreakPoint 
8013eecc  8013313c  0000001e c0000005 8013cd0a NT!_KeBugCheckEx+0x194
fe40cad0  8013318e  fe40caf8 801359ff fe40cb00 NT!PspUnhandledExceptionInSystemThread+0x18
fe40cad8  801359ff  fe40cb00 00000000 fe40cb00 NT!PspSystemThreadStartup+0x4a
fe40cf7c  8013cb8e  fe43a44c ff6ce388 00000000 NT!_except_handler3+0x47
00000000  00000000  00000000 00000000 00000000 NT!KiThreadStartup+0xe

kd> dd fe40caf8 L2            dump EXCEPTION_POINTERS structure
0xFE40CAF8  fe40cd88 fe40cbc4                   ..@...@.

kd> .exr fe40cd88             first DWORD is the exception record
Exception Record @ FE40CD88:
   ExceptionCode: c0000005
  ExceptionFlags: 00000000
  Chained Record: 00000000
ExceptionAddress: 8013cd0a
NumberParameters: 00000002
   Parameter[0]: 00000000
   Parameter[1]: 0362cfff

kd> .cxr fe40cbc4             second DWORD is the context record
CtxFlags: 00010017
eax=00087000 ebx=00000000 ecx=03ff0000 edx=ff63d000 esi=0362cfff edi=036b3fff
eip=8013cd0a esp=fe40ce50 ebp=fe40cef8 iopl=0         nv dn ei pl nz ac po cy
vip=0    vif=0
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010617
0x8013cd0a  f3a4             rep movsb

kd> kb                        kb gives stack for context record
ChildEBP RetAddr  Args to Child
fe40ce54 80402e09 ff6c4000 ff63d000 03ff0000 NT!_RtlMoveMemory@12+0x3e
fe40ce68 80403c18 ffbc0c28 ff6ce008 ff6c4000 HAL!_HalpCopyBufferMap@20+0x49
fe40ce9c fe43b1e4 ff6cef90 ffbc0c28 ff6ce009 HAL!_IoFlushAdapterBuffers@24+0x148
fe40ceb8 fe4385b4 ff6ce388 6cd00800 ffbc0c28 QIC117!_kdi_FlushDMABuffers@20+0x28
fe40cef8 fe439894 ff6cd008 ffb6c820 fe40cf4c QIC117!_cqd_CmdReadWrite@8+0x26e
fe40cf18 fe437d92 ff6cd008 ffb6c820 ff6e4e50 QIC117!_cqd_DispatchFRB@8+0x210
fe40cf30 fe43a4f5 ff6cd008 ffb6c820 00000000 QIC117!_cqd_ProcessFRB@8+0x134
fe40cf4c 80133184 ff6ce388 00000000 00000000 QIC117!_kdi_ThreadRun@4+0xa9
fe40cf7c 8013cb8e fe43a44c ff6ce388 00000000 NT!_PspSystemThreadStartup@8+0x40