BSoD対策#

BSoDが発生した際には、下記の3つのレベルに応じたメモリダンプファイルへ出力することが可能です。原因調査にはこれらのファイルが必要となります。

最小ダンプ:

2MByte程度のページングファイルを用いて意図せずWindowsが終了した際のログを記録します。

自動ダンプ:

150~2GByteのページングファイルを用いて、意図せずWindowsが終了した際のログを記録します。カーネルプログラムの問題追跡に役立ちます。ページングするメモリサイズによっては完全には記録されなくなります。

完全ダンプ:

カーネルプログラムだけではなく、ユーザプログラムの異常も記録します。全物理メモリファイルに加えて400Mbyteのページングファイルを用意する必要があります。

このダンプファイルはメモリサイズに応じた大容量のストレージの空き容量を必要とします。したがって、システムの環境によっては空き容量が十分ではなく、確実にこれらのダンプファイルが残らない事があります。

本書の手順では完全ダンプファイルを確実に記録する事を目指した手順を示します。そのために十分な空き容量のストレージを用意し、そこへページングファイルとダンプファイルを出力するための設定を行います。まずは準備として下記の通りNTFSでフォーマットされたUSB接続の外部ストレージドライブ(HDDタイプ)をIPCのUSBポートへ接続してください。(図 7.2

警告

  • USBメモリなどのリムーバブルドライブは使用できません。また、固定ドライブでもSSDはBSoD中アクセスできない機種があります。外付けHDDをご選択ください。

  • 十分な空き容量がC:ドライブにある場合は、外付けのストレージを取り付ける必要はありません。ただし、本手順書のドライブ名をC:と読み替えてください。

  • 外付けストレージが不要になった場合は、本書の逆手順で設定を元にもどしてください。

../_images/external_storage.png

図 7.2 外付けストレージドライブの接続#

本書ではD:ドライブに接続したものとして説明します。

仮想メモリ設定#

キー:

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlCrashControl

:

DedicatedDumpFile

データ:

<ドライブ名>+<パス> (文字列値)

String Value型のエントリを新規作成。

../_images/crash_control_new_string.png

エントリー名をDedicatedDumpFileに設定

../_images/new_dedicated_dump_file.png
ダブルクリックして値を保存先に設定

例とえば、Dドライブが外付けUSBストレージでその直下にdedicateddumpfile.sysという名前で仮想メモリファイルを作る場合は右図の通り設定する、

../_images/path_dedicated_dump_file.png

続いて、

キー:

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlCrashControl

名前:

DumpFileSize

データ:

メインメモリが\(M\)GByte とすると\(1024M + 400\)の整数値 (DWORD値)

  1. DWORD (32bit) Value型のエントリを新規作成

    ../_images/crash_control_new_dword.png
  2. エントリー名をDumpFileSizeに設定

    ../_images/new_dump_file_size.png
  3. ダブルクリックして値を設定

    値の基数を10進数Decimalに設定し、メモリ容量 + 400 MByteの整数値をMByteの単位で設定する。計算方法としては メインメモリが\(M\)GByte とすると\(1024M + 400\)となる。例えば 8 Gbyteの場合は右図の通り設定する。

    ../_images/value_dump_file_size.png

ダンプファイル保存設定#

  1. スタートメニューからSearchを選択

    ../_images/start-search.png
  2. SystemPropertiesAdvancedと入力してEnterキーを押します。

    ../_images/systempropertiesadvanced.png
  3. Advancedタブが開いている事を確認し、Startup and Recovery内のSettings...ボタンをクリックします。

    ../_images/startup_and_recovery.png
  4. 次の3点を変更します。

    項目

    設定方法

    Write debugging information

    Automatic memory dump > Complete memory dump

    Dump file

    外付けストレージ内に保存するダンプファイル名

    Disable automatic deletion of memory dumps when disk space is low

    OFF > ON

    ../_images/complete_memory_dump.png

設定確認#

設定が正しく反映されているか確認するためには、BSoEを実際発生させる必要があります。Microsoft社のドキュメントから下記のURLを参照して実施してください。

https://learn.microsoft.com/ja-JP/troubleshoot/windows-client/performance/generate-a-kernel-or-complete-crash-dump#manually-generate-a-memory-dump-file

注釈

  • NotMyFaultツールはAdministrator権限で実施する必要があります。

  • NotMyFaultツールは32bit版64bit版のOS向けにそれぞれ用意されています。正しいファイルで実行してください。

ダンプファイル解析手順#

  1. 下記サイトにある Windows SDK からインストールする方法で WinDbg をインストールします。

    https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/debugger-download-tools

  2. インストールが終了したら管理者権限で WinDbg を起動します。

  3. シンボルサーバの設定

    最初に、ファイルメニューからSymbol file path ...を選択し、現れたウィンドウに次の文字をコピーペーストしてOKボタンを押します。

    Srv*c:\symbols*\\mainserver\symbols*https://msdl.microsoft.com/download/symbols
    
  4. メモリダンプファイルの読み込み

    ファイルをファイルメニューのOpen crash dump...を選択して保存したMEMORY.DMPを読み込みます。これにより最初にシンボル解析を行います。

  5. シンボル解析が終了すると、下記の通り現れます。最後の!analyze -vの部分のリンクをクリックする事で、ダンプファイルの解析を始めます。

    Loading User Symbols
    .............................
    Loading unloaded module list
    ...
    For analysis of this file, run !analyze -v
    
  6. 解析が終了するとレポートが出力されます。下記に抜粋した部分の最下部にある様に、PROCESS_NAMEを記載されている項目に、問題のあったプログラムが明示されます。

    FILE_IN_CAB:  MEMORY.DMP
    
    BUGCHECK_CODE:  d1
    
    BUGCHECK_P1: ffffdb88c69df720
    
    BUGCHECK_P2: 2
    
    BUGCHECK_P3: 0
    
    BUGCHECK_P4: fffff801995b12d0
    
    READ_ADDRESS:  ffffdb88c69df720 Paged pool
    
    BLACKBOXBSD: 1 (!blackboxbsd)
    
    
    BLACKBOXPNP: 1 (!blackboxpnp)
    
    
    PROCESS_NAME:  notmyfault64.exe