エラー報告にもう一声。

怒るのはちょっと待ってよぉ

 我々ソフトウェア作者はなるべくバグを出さないように気をつけてプログラムを組んでいますが、それでもどうしてもバグを出して、こんなダイアログの出るようなバグを出してしまうことことがあるかもしれません。
↓こんなの。
[Windows XPのエラーダイアログ]
 怒りたい気持ちは良く分かりますが、オンラインソフトとか作者のはっきりしているソフトだったら、怒る前にちょこっとこんな報告をしていただけると助かります。

1.どこでエラーが起こったか報告してあげよう(Windows XP & 2000)
2.Windows Vistaではどうする?
(エラー報告にもう一声。Part.2 Windows Vista編)
3.Windows 7以降ではどうする?
(エラー報告にもう一声。Part.3 Windows 7以降編)
4.MAPファイルに目を向けよう

1.どこでエラーが起こったか報告してあげよう

 では、どのようにすればソフトの作者にエラーを報告できるのでしょうか。
 Windows XPを例にソフトの作者にエラーを報告する方法を説明します。
 まずは、さっきのダイアログが出たところで「ここをクリックしてください。」と書いてあるところをクリックします。
 するとこのような画面が出ます。
[Windows XPのエラーダイアログ2]
 次に、エラー報告に関する技術情報とかいてあるところの横をクリックしてください。
 そうすると、情報の宝庫であるこの画面が出ます。
[エラー報告の内容]

 ここで、下線の引いてあるところの情報を自分のマシンの環境(OS、CPUなど)やエラーの出たソフトで行った操作、対象となるデータの内容といった情報とともに書いて、作者にメールなどで教えてあげてください。
 この場合は、40100eという値になります。
「エラーが起こったアドレスは40100eです。」とでも書いてメールを送ってください。

 作者に情報を伝える準備ができたら、あとは送信しないを押しましょう。
 Microsoftに送っても多分無駄でしょうし。Tatsuが作ったソフトでエラーが起こったとしてもMicrosoftにとってはTatsuなんてどこの馬の骨か分からん奴の作ったソフトなんて知ったこっちゃないです。

 ちなみに、Windows 2000ではアプリケーションエラーダイアログの「"0x(プログラムによって異なる16進数の値)"の命令が"0x(プログラムによって異なる16進数の値)"」とあるところをメールで教えてあげてください。

[Windows 2000のエラーダイアログ]
 ここでは、40100eという値になります。

2.Windows Vistaではどうする?

 Windows XPでは無事にソフト作者にエラーを報告するための情報を得ることができました。
 では、Windows Vistaではどうでしょう?

 Windows Vistaでもある程度エラーを報告するための情報を得ることができますが、そのためにはいくつかの手順が必要です。
 エラー報告にもう一声。Part.2 Windows Vista編に手順をまとめましたので、こちらをご覧ください。

3.Windows 7以降ではどうする?

 Windows XP/Vistaではソフト作者にエラーを報告するための情報を得ることができました。
Windows 7以降ではどうでしょう?

 Windows 7以降ではこれまた必要となる手順が違ってきます。
 エラー報告にもう一声。Part.3 Windows 7以降編に手順をまとめましたので、こちらをご覧ください。

4.MAPファイルに目を向けよう

 こうして報告が来たらプログラマーは何をすればよいのでしょうか?

 まず、プログラムをコンパイルする際にコンパイラのオプションでMAPファイルを出力する旨のオプションを指定しましょう。

 次に、先ほど述べた説明のAddress:と書いてあるところ(Windows 2000では~の命令が)とあるところの16進数(0x0040100e)未満の近い値を探してください。
 Windows Vistaの場合は例外オフセットの横に書いてある値に0x00400000を足した値未満の近い値を探します。

(.NET Framework SDKのC++コンパイラの例)
Address Publics by Value Rva+Base Lib:Object

0000:00000000 __except_list 00000000 <absolute>
0001:00000000 _main 00401000 f jibaku.obj
0001:00000019 _printf 00401019 f LIBC:printf.obj

 この例ではRva+Baseとあるところを探します。すると、一番近い値が00401000というもので、その横に、_mainと書いてあります。コンパイラによっても異なりますが、mainというシンボル(C/C++では関数)のあるところを探してみてください。
 そこ(C/C++ではその関数)の中にエラーがあるので、あとはその関数の中でエラーがあるところを探してみましょう。
 バグは見つかりましたでしょうか?
 ソースとにらめっこするよりは再現条件が難しいバグになるほどバグが見つかりやすくなると思います。

 ちなみに、Borland C++ 5.5.1ではNameで_TEXTとあるところのStartの16進値(下では401000)にシンボル名の横にある16進値(00000150)を足した値が該当する値になります。

(Borland C++ 5.5.1の例)
Start Length Name Class
0001:00401000 0000089BCH _TEXT CODE

0001:00000150 _main

 この方法、C/C++では関数といったプログラムのシンボルが出る単位が長くなるほど、バグが出た個所の候補が広がるのでプログラムはなるべく小さな単位で書くようにしたほうがより効率的になります。この方法に限りませんが。

最後に

 エラーが起こったときの前向きな対処について書いてきましたが、やっぱりエラーが起こると腹立たしいですよね。
 ですが、こうして報告をいただけると、作者にとっても対策が取りやすくなるし、ユーザーにとっても作者と良い関係が築くきっかけになるのではないでしょうか。
 実際自分もこれで助かったことがあるので、役に立つかなと思い書いてみた次第です。
 それにしても、エラーが起こった場所を報告するための情報がシステムから知らされるなんて、良い時代になったものです。

Tatsuの開発室に戻る

御意見、御感想、御希望等ありましたら何でもE-Mailでどうぞ


[Tatsu's room on the Web] This page is presented by Tatsu

おまけ

 VB6にはMAPファイルってないんだよなぁ。
 バグが出たときに知る方法が減るではないか。
 というわけで、VBランタイムがいるようなソフトに今回の報告をしても無駄なので本稿の報告をする際は動作条件をしっかりと見ておきましょう。
...やっぱ、VBっておもちゃだよな。