C#2.0時代のゲームプログラミング(33)

■ お客さんのところでのみ落ちるアプリのデバッグ


「プログラムは必ずお客さんのところで落ちる。何故なら、社内で落ちるならば開発時にそのバグは取れているはずだからだ」などとマーフィーの法則じみたことを考える。


お客さんのところで落ちるプログラムのエラーをどうやれば追跡できるだろうか?
また、ここで言う落ちるというのは、たいていはハンドルされていない例外のことを指すものとする。


■ 例外情報のdump


.NETアプリケーションならば、


catch (Exception e)
{
Console.WriteLine(e.StackTrace);
}

とすれば、スタックトレース(呼び出し履歴)が表示できる。pdbファイルを実行ファイルと同じフォルダに配置しておけば、どの行で落ちたかまで表示できる。*1


さらに詳しい方法については、適切に処理されなかった例外をキャッチするには?にある。


実際はこのときにログファイルに書き出して、お客さんには落ちたときのログを送ってもらうと良いかも知れない。


■ 落ちているアドレスから該当箇所を特定できないのか?


C++ではmap fileを生成すれば簡単に出来るのだが、.NETのアプリでは一筋縄ではいかない。これについては機を改めて書く。


■ 結論


stack dumpは、アプリケーションデバッグの有効な手段である。どんなアプリでもとりあえず捕捉されなかった例外はスタックダンプしてログに書き出す処理ぐらいは、やっておくだけの価値はある。


ただ、難読化が絡むと話はそう簡単でもない。これについても書ききれないので機を改めて書く。

*1:id:akirameiさんに教えてもらった。