Windowsでアプリケーション異常終了の原因を追及する¶
はじめに¶
Windows OS上で、ネイティブ・コードのアプリケーションソフトウェアを利用しているときに、「応答なし」などのハングアップ(フリーズ)や異常終了してしまうことが偶にあります。開発環境であれば、デバッガーをアタッチしていろいろ調査することができますが、リリース先の環境では開発環境はありませんし、勝手にソフトウェアをインストールすることができませんし、調査方法はかなり限定されてしまいます。
操作手順で確実にハングアップや異常終了を再現することができ、かつ開発環境で再現することができればよいですが、そうでない場合は(こっちの場合が大半)、なかなか原因を特定することができません。
利用者の観点では、異常が発生した状況を伝え、アプリケーションのログ情報を取得して送付し、その後はなしのつぶて、日常の利用では異常終了が発生しては再度立ち上げてやり直し、ということを繰り返すのはうんざりさせられる状況です。
この原因を追及する方法がないか調べたことを本記事にまとめていきます。
方法¶
ダンプの取得と解析¶
アプリケーションソフトウェアのプロセスの実行状態・メモリの情報をダンプファイルとして作成し、ダンプファイルを解析することで、ダンプファイル作成時点の状況を知ることができます。
手順¶
ダンプの取得¶
アプリケーション・プロセスが異常終了したときに、その瞬間のメモリの情報、実行状態をファイルに出力したものを一般にダンプと呼びます。
TODO)メモリダンプ、クラッシュダンプの意味を調べる(同じことか?)
Windows OSでは、ダンプには大きく3種類あるようです。
- 最小メモリダンプ(ミニダンプ):数十KB、例外発生コード、スタックの情報で、メモリ情報は含まれない
- カーネルメモリダンプ:数十~数百MB、カーネルモードのメモリ情報を含む。ブルースクリーン時の原因究明に使う
- 完全ダンプ:巨大(搭載物理メモリ量による?)、ユーザーモードのメモリ情報を含む
ダンプファイルの取得には、いくつか方法があります。
タスクマネージャからダンプ¶
アプリケーションが異常終了するときに、OSのエラーダイアログが表示されている間は、まだプロセスが生きているのでダンプの取得が可能です。
タスクマネージャを開き、異常終了のプロセスを右クリックし、[ダンプファイルの作成]を選択します。作成が終わると、保存先を表示します(自由に保存先を指定はできない模様)。%LOCALAPPDATA%\Temp\ に出る模様。
TODO)タスクマネージャから作成したダンプファイルの種類とサイズを調べる
→ 100MB弱のサイズ(32bitのサンプルアプリの場合)
WERによるダンプ¶
Windows XPまではワトソン博士と呼ばれる機能でダンプしていましたが、Windows Vista以降では、WER(Windows Error Reporting)を有効にしダンプを取得します。WERはデフォルトでは無効なので、OSの管理者権限を持ち、かつ設定を変更することが許されているときに限られます。
- 実行中のプロセスのダンプを取得
- プロセスが障害発生時にダンプを取得
レジストリを設定する必要あり。
https://msdn.microsoft.com/en-us/library/bb787181.aspx
\\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps
キーに、次のキーの値を設定
DumpFolder
DumpCount
DumpType
CustomDumpFlags
特定のアプリケーションだけダンプを取得する場合は、上述のレジストリのキー(LocalDumps)の下に、実行ファイル名(alfa.exe等)のキーを作ってその中にキーの値を設定します。
ProcDumpツールによるダンプ¶
Microsoftが別途配布するSysinternralsSuiteに含まれるコマンドラインツール ProcDump を使ってダンプを取得します。
https://technet.microsoft.com/ja-jp/sysinternals/dd996900.aspx
Process Explorerツールによるダンプ¶
Microsoftが別途配布するSysinternralsSuiteに含まれるGUIツール Process Explorer を使ってダンプを取得します。
https://docs.microsoft.com/ja-jp/sysinternals/downloads/process-explorer
対象プロセスが生きていれば、Process Explorer上で右クリックから[ダンプの作成]で、種類をミニダンプか完全ダンプかを選択して作成します。
ダンプファイルの解析¶
WinDbg¶
WinDbgを起動し、ダンプファイルを読み込みます。
[File]メニュー > [Open Crash Dump...]からダンプファイルを指定します。
クラッシュの解析には、!analize -v
を実行します。
ツール¶
WinDbg¶
入手について¶
WinDbgの入手とインストールには諸説ありますが、2018年初頭時点では、WinDbgはWindows SDKのインストーラーから、インストールする機能の1つにあるDebugging Tools for Windowsを選択してインストールする方法となります。
Windows SDKは、新しいバージョン(2018年3月現在、Windows 10 SDK)が古いバージョン(Windows 7以降)をサポートしているのでこれを入手します。
Windows SDKは、バージョン8以降、オフラインインストーラーやISOイメージが提供されないことが多くなっています。
Windows SDK and emulator archive
ここに、Windows 10 SDKの古い特定のバージョン(10.0.15063.468)のISOイメージのダウンロードリンクがあります。この前後のバージョンはISOが用意されていませんでした。
ISOが提供されていない場合は、いったんインターネットにアクセスできるPCにインストーラー(オンライン)をダウンロードし実行し、インストーラー実行後に"Download the Windows Software Development Kit - Windows 10.xxxx for installation on a separate computer"を選ぶと、必要なファイル群が指定したフォルダに保存されます。これをまとめてインターネットにアクセスできないPCに持って行ってインストールするとよいようです。
技術情報へのリンク¶
WinDbg.From A to Z!
WinDbg - Microsoft系技術情報Wiki
BadApp¶
クラッシュ、フリーズといった状況を擬似的に発生させるプログラム。トラブルシュートの練習に用いる。
http://www.ntwind.com/software/utilities/badapp.html
Windows OSのバージョン固有情報¶
古い情報¶
インターネット上には、古い情報(Windows XPまでの情報、など)が氾濫しているので、調べる側にも新旧の情報を区別する知識が必要になります。
ワトソン博士¶
ワトソン博士(drwtsn32.exe)は、Windows Vistaを含め以降には搭載されなくなりました。代わりにWER(Windows Error Reporting)機能が搭載され、ユーザーモードダンプを生成します。
User Mode Process Dumper(UMPD)¶
Windows XPまでで利用可能なダンプツールです。Windows Vista以降は、タスクマネージャから、WERから、あるいは ProcDumpツールで取得します。
WinDbgのダウンロード方法¶
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools