プロジェクト

全般

プロフィール

Windowsでアプリケーション異常終了の原因を追及する

はじめに

Windows OS上で、ネイティブ・コードのアプリケーションソフトウェアを利用しているときに、「応答なし」などのハングアップ(フリーズ)や異常終了してしまうことが偶にあります。開発環境であれば、デバッガーをアタッチしていろいろ調査することができますが、リリース先の環境では開発環境はありませんし、勝手にソフトウェアをインストールすることができませんし、調査方法はかなり限定されてしまいます。

操作手順で確実にハングアップや異常終了を再現することができ、かつ開発環境で再現することができればよいですが、そうでない場合は(こっちの場合が大半)、なかなか原因を特定することができません。

利用者の観点では、異常が発生した状況を伝え、アプリケーションのログ情報を取得して送付し、その後はなしのつぶて、日常の利用では異常終了が発生しては再度立ち上げてやり直し、ということを繰り返すのはうんざりさせられる状況です。

この原因を追及する方法がないか調べたことを本記事にまとめていきます。

方法

ダンプの取得と解析

アプリケーションソフトウェアのプロセスの実行状態・メモリの情報をダンプファイルとして作成し、ダンプファイルを解析することで、ダンプファイル作成時点の状況を知ることができます。

手順

ダンプの取得

アプリケーション・プロセスが異常終了したときに、その瞬間のメモリの情報、実行状態をファイルに出力したものを一般にダンプと呼びます。

(!) TODO)メモリダンプ、クラッシュダンプの意味を調べる(同じことか?)

Windows OSでは、ダンプには大きく3種類あるようです。

  1. 最小メモリダンプ(ミニダンプ):数十KB、例外発生コード、スタックの情報で、メモリ情報は含まれない
  2. カーネルメモリダンプ:数十~数百MB、カーネルモードのメモリ情報を含む。ブルースクリーン時の原因究明に使う
  3. 完全ダンプ:巨大(搭載物理メモリ量による?)、ユーザーモードのメモリ情報を含む

ダンプファイルの取得には、いくつか方法があります。

タスクマネージャからダンプ

アプリケーションが異常終了するときに、OSのエラーダイアログが表示されている間は、まだプロセスが生きているのでダンプの取得が可能です。
タスクマネージャを開き、異常終了のプロセスを右クリックし、[ダンプファイルの作成]を選択します。作成が終わると、保存先を表示します(自由に保存先を指定はできない模様)。%LOCALAPPDATA%\Temp\ に出る模様。

(!) TODO)タスクマネージャから作成したダンプファイルの種類とサイズを調べる
→ 100MB弱のサイズ(32bitのサンプルアプリの場合)

WERによるダンプ

Windows XPまではワトソン博士と呼ばれる機能でダンプしていましたが、Windows Vista以降では、WER(Windows Error Reporting)を有効にしダンプを取得します。WERはデフォルトでは無効なので、OSの管理者権限を持ち、かつ設定を変更することが許されているときに限られます。

  • 実行中のプロセスのダンプを取得

\\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を選択してインストールする方法となります。

windows10sdk_installer-2.png

Windows SDKは、新しいバージョン(2018年3月現在、Windows 10 SDK)が古いバージョン(Windows 7以降)をサポートしているのでこれを入手します。

Windows 10 SDK

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に持って行ってインストールするとよいようです。

windows10sdk_installer-1.png

技術情報へのリンク

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

クリップボードから画像を追加 (サイズの上限: 1 GB)