Windows8 アプリのクラッシュ時にダンプファイルを作成する。

デフォルトではアプリクラッシュ時にダンプファイルが作成されない。

OSやアプリがクラッシュしたら、私はWinDbgでダンプファイルを調べています。
詳しく解析できるわけではありませんが、おおよその原因がわかることがあります。

しかし、Windows8のデフォルト設定では次のようになっています。

  • システムのクラッシュ時 → ダンプファイルを作成。
  • アプリケーションのクラッシュ時 → ダンプファイルを作成しない。

アプリのクラッシュでもダンプファイルを作成したければ、レジストリで設定する必要があります。

[参照]
http://msdn.microsoft.com/ja-jp/library/bb787181.aspx

アプリのクラッシュダンプを自動作成させる設定

(以下の設定が使えるのは、Windows Vista 及び Windows Server 2008以降)

まずサービス(services.msc)を起動して、Windows Error Reporting Serviceを有効(手動または自動)にしておきます。

  1. レジストリエディター(regedit.exe)を起動する
  2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting

    Windows Error Reportingを右クリック→新規→キー
    名前にLocalDumpsと入力。

  3. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps

    画面の右の空白部分で右クリック、またはメニューの編集から

    • 新規作成→展開可能な文字列値(REG_EXPAND_SZ)

      値の名前 DumpFolder
      値のデータ (例えば)C:\CrashDumps

      (ダンプファイルの保存先フォルダーのフルパス)

    • 新規作成→DWORD値

      値の名前 DumpCount
      値のデータ (例えば)10 [10進数]

      (ダンプファイルの最大作成数。それを超えたら、古いものから消える)

    • 新規作成→DWORD値

      値の名前 DumpType
      値のデータ 0~2のいずれか

      0=カスタムダンプ 1=ミニダンプ 2=完全(フル)ダンプ

    • 新規作成→DWORD値

      値の名前 CustomDumpFlag
      値のデータ (数字を入力。次章を参照)

      (DumpTypeが0、つまりカスタムダンプの時のみ使用される設定)

LocalDumpsの設定例 フルダンプ

以上の設定を取り消してデフォルトに戻す場合は、LocalDumpsキーを削除します。

CustomDumpFlagsに入れる数値

  • 0x00000000 MiniDumpNormal
  • 0x00000001 MiniDumpWithDataSegs
  • 0x00000002 MiniDumpWithFullMemory
  • 0x00000004 MiniDumpWithHandleData
  • 0x00000008 MiniDumpFilterMemory
  • 0x00000010 MiniDumpScanMemory
  • 0x00000020 MiniDumpWithUnloadedModules
  • 0x00000040 MiniDumpWithIndirectlyReferencedMemory
  • 0x00000080 MiniDumpFilterModulePaths
  • 0x00000100 MiniDumpWithProcessThreadData
  • 0x00000200 MiniDumpWithPrivateReadWriteMemory
  • 0x00000400 MiniDumpWithoutOptionalData
  • 0x00000800 MiniDumpWithFullMemoryInfo
  • 0x00001000 MiniDumpWithThreadInfo
  • 0x00002000 MiniDumpWithCodeSegs
  • 0x00004000 MiniDumpWithoutAuxiliaryState
  • 0x00008000 MiniDumpWithFullAuxiliaryState
  • 0x00010000 MiniDumpWithPrivateWriteCopyMemory
  • 0x00020000 MiniDumpIgnoreInaccessibleMemory
  • 0x00040000 MiniDumpWithTokenInformation
  • 0x00080000 MiniDumpWithModuleHeaders
  • 0x00100000 MiniDumpFilterTriage
  • 0x001fffff MiniDumpValidTypeFlags

左の数字を16進数で入力します。

MiniDumpNormalだけなら0。
MiniDumpNormalの他に追加したい項目(複数選択可能)があれば、その項目に割り当てられた数字を16進数で合計します。

http://msdn.microsoft.com/ja-jp/library/ms680519.aspx より

さらに詳細な説明が書かれているサイト

http://www.debuginfo.com/articles/effminidumps.html
(2005年7月更新の記事)

[参考例]

下のURLでは、Microsoft Dynamics AX Application Object Serverがクラッシュする場合に、Microsoftに提出するためのダンプファイルの作成方法が指示してあります。

http://blogs.msdn.com/b/axjapan/archive/2011/12/16/windows-error-reporting-aos-ax32serv-exe.aspx

そこでは、CustomDumpFlags 1b67(16進数) = 7015(10進数)となっています。

おそらく次のようになると思います。

  • (0x00000000 MiniDumpNormal)
  • 0x00000001 MiniDumpWithDataSegs
  • 0x00000002 MiniDumpWithFullMemory
  • 0x00000004 MiniDumpWithHandleData
  • 0x00000020 MiniDumpWithUnloadedModules
  • 0x00000040 MiniDumpWithIndirectlyReferencedMemory
  • 0x00000100 MiniDumpWithProcessThreadData
  • 0x00000200 MiniDumpWithPrivateReadWriteMemory
  • 0x00000800 MiniDumpWithFullMemoryInfo
  • 0x00001000 MiniDumpWithThreadInfo

16進数で全部足せば、1b67。

関連記事