エラーメッセージの意味を知りたい

一般保護例外などのエラー時に表示される詳細情報の読み方を教えてください。


一般保護例外(違反)やページ違反のダイアログは,Windowsユーザーなら見たことがある人が多いかもしれません。とくにオーバークロックなどをしているユーザーは何度も見ているはずです。
 質問にある一般保護例外は,プログラムが特権違反を起こした(具体的には,ユーザープログラムがアクセスすることができないセグメントにアクセスしようとした)ときに発生します。またページ違反は,存在しないメモリページにプログラムがアクセスしようとすると発生します。いずれの場合も,プログラムが「OSから許可されていない動作」をしたことを示し,Windowsが違反を捕捉して画面のようなダイアログを出すのです。
 原則として,バグのないソフトウェアなら例外を発生させることはありません。しかし,オーバークロックをしているなどPCに不安定な要素があると,メモリページング機構や保護機構がハード的に支障をきたし,その結果として違反のダイアログが出現する場合があります。
 ダイアログの内容は,ある程度CPUとソフトウェアについての知識がないと読解できません。内容が分かる程度に解説するには(まったく)誌面が足りませんので,概要だけを説明しておきましょう。
 ダイアログには,まずエラーを発生させたモジュールの名前と例外の種類(一般保護例外など),そしてエラーを起こしたメモリアドレスが示されます。
 画面のRegisters:以降,EAX=0000000a……と続く部分は,エラーが発生したときのCPU内部レジスタの値です。
 Bytes at CS:EIP以下は,エラーを起こした部分のアドレスのメモリダンプです。この部分にある命令がエラーを起こしたと解釈してかまいません。
 Stack dump:以下は,エラーが発生したときのスタック(SS:ESPが指すメモリアドレス)の内容です。
 さて,これらの情報から何が分かるのでしょうか。理屈のうえでは,エラーを起こしたメモリアドレスと,そのときのレジスタの内容,エラーを起こした部分のメモリダンプやスタックダンプから,エラーを発生させたバグの原因が分かる可能性はあります。といっても,そのプログラムの内容をまったく知らない第三者(要するにユーザーのこと)に何か分かるというわけではありません。あくまでプログラムを開発した本人に意味のある情報と考えてください。
 また,エラーの原因がハードウェアの不安定にある場合,開発者にとってさえ,まったく無意味な情報といえます。動作不安定なPCは正常なプログラムでもエラーを起こしますから,その原因をソフトウェアに求めても無意味です。
 もっとも,プログラム開発者本人でなくてもエラーの原因究明は不可能ではありませんが,そのためには画面のようなダイアログはほとんど役に立ちません(せいぜいヒント程度にしかならない)。バグを突き止めたいのなら,デバッガや逆アセンブラなどのツールを駆使する必要があるでしょう(これらを扱うにはソフトウェア作成に関する高度な知識が必要です)。
 PCが安定していて,なおかつ読者が持っているソフトウェアが例外エラーを必ず発生させるようなら,ソフトウェアのバグの疑いが濃厚です。しかし,以上に示した標準のエラーダイアログ情報は少なすぎ,開発者であってもエラーの究明に役に立たないことがあります。バグレポートをメーカーや作者に送る場合,エラーが発生する条件とともに,より詳しい記録を残すDr.ワトソン(Windows 98のシステム情報から起動できます)のログを添えて送るといいでしょう。  
(米田 聡)


ページ違反のときに出現するダイアログの例