Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
前回は Windows SDK ツールそのものをご案内いたしましたが、今回は、それに同梱されている Application Verifier (アプリケーション ベリファイア) についてご紹介しましょう。
アプリケーション ベリファイアは、アプリケーションが、ある程度完成した段階で、検証のために使用し、内在しているかもしれない問題を検出してくれるツールです。
メモリ リークの検出には LeakDiag ツール、ヒープメモリに関する検出には DebugDiag や PageHeap ツールなどがありますが、アプリケーション ベリファイアは、いろいろな検証項目をまとめた便利ツールでもあります。デバイス ドライバーを開発される方なら、ドライバー ベリファイアの名前をご存じかもしれません。今回は、アプリケーション側の検証ツールです。
どこにインストールされているの?
Windows SDK を、既定どおりにインストールした場合、スタート ボタンから表示する [すべてのプログラム] に [Application Verifier] が登録されています。また、以下のフォルダーに関連ファイルが登録されています。
C:\Program Files\Application Verifier
Application Verifier.lnk
ファイルは LNK ファイルで、実体は C:\Windows\System32\AppVerif.exe にあります。
つまり、コマンド プロンプトから、AppVerif.exe を指定して起動することもできます
使用方法は簡単
まずは、起動してみましょう。スタート ボタンから、[すべてのプログラム] を選び [Application Verifier] を指定します。
(管理者権限が必要です。)
以下のようなウィンドウが表示されます。
(申し訳ないですが、このツールに日本語版はありません。そんなに複雑なメニュー構成ではありませんし、数個のメニューしか使うことはないので、覚えてしまいましょう。)
アプリケーションを検証するには、以下の手順を実施します。
1. テストしたいアプリケーション名を登録します。[File] メニューの [Add Application] を選び、アプリケーション (*.exe) を選択します。
2. 右側のペインで検証したい項目を選択します。既定では [Basics] が選択済みになっています。
3. [Save] ボタンを押して登録し、[Exit] で終了してください。([Save] することでレジストリに登録されます。)
アプリケーション ベリファイアそのものを終了しても、設定内容はレジストリに登録されていますので、検証中にアプリケーション ベリファイアを起動しておく必要はありません。
アプリケーションの検証が終わったら、登録を解除してください。そのまま放置しておきますと、アプリケーションが起動するたびに検証結果が記録され続けます。(長期に渡って記録しておくことも必要なこともありますけど。)
登録を解除するには以下の手順を実行します。
1. アプリケーション ベリファイア (AppVerif.exe) を起動します。
2. 登録済みのアプリケーション名が表示されていますので、そのファイル名を右クリックして、[Delete Application] を選択します。
3. [Exit] ボタンを押して終了します。
【レジストリ設定箇所】
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
このレジストリ キーの中に、アプリケーション名が登録されています。
登録を解除しても、アプリケーション名は残りますので、残骸が気になる人は、ここの場所を調べて、アプリケーション名以下のキーを手動で削除してください。
アプリケーション ベリファイアの検出機能
「どのような問題を検出できるのか?」「どのような設定をすればいいのか?」などの疑問が湧いてきたと思います。
それらの疑問を解決してくれる MSDN ライブラリの日本語ドキュメントがございます。お手数ですが、下記のドキュメントをご参照ください。
(以下の URL を SHIFT キーを押しながらクリックしますと、このページを表示したまま、別のブラウザーが開きます。CTRL キーでもいいですよ。)
ソフトウェア開発ライフサイクル内で Application Verifier を使用する
https://msdn.microsoft.com/ja-jp/library/aa480483.aspx
検証方法について
アプリケーション ベリファイアの既定値では、エラー発生時にデバッガーにブレークするようになっています。もし、エラーが多発する場合は、各検証項目を右クリックして [Verifier Stop Options] を選択し、それぞれのエラー項目の [Error Reporting] グループ内にある [Breakpoint] (既定値) でなく [No Break] を選択すると素通りするようになります。(後からログで確認するため [Log to File] や [Log Stack Trace] のチェックは ON のままにしておくことをお勧めします。)
このように、問題を検出したらブレークするようになっていますので、検証する際には、WinDBG.exe を起動して、WinDBG.exe の [File] メニューの [Open Executable...] を選択して、ここからアプリケーションを選択して起動してください。
エラーが検出されたら?
以下のようなエラー メッセージがデバッガー (WinDBG.exe) に表示されます。
Invalid handle - code c0000008 (first chance) =======================================VERIFIER STOP 0000000000000300: pid 0x1418: Invalid handle exception for current stack trace. 00000000C0000008 : Exception code.000000000009E5C0 : Exception record. Use .exr to display it.000000000009E0D0 : Context record. Use .cxr to display it.0000000000000000 : Not used. |
このようなメッセージの注目すべきは、STOP コードです。上記の場合は 0300 です。
また、Exception code が 0xC0000008 ですので、STATUS_INVALID_HANDLE であることがわかります。
それに、 .exr (例外レコードの表示) や .cxr (コンテキスト レコードの表示) コマンドを使用せよ、と書いてあります。
多くの場合、どのようなコマンドを入力して解析すべきかは、エラー メッセージか、ヘルプ ドキュメントに記載されています。
アプリケーション ベリファイアを使用して検証している際には、!avrf コマンドも使用でき、いろいろな解析オプションが提供されていますので、WinDBG.exe の Command ウィンドウで、 !avrf -? を実行して、コマンド ヘルプもご参照ください。
(しかしながら、いろいろな発生状況がありますので、一般的なコマンド操作だけで、根本原因を特定することは難しいです。私はいろいろな関連コマンドを試し、表示された情報の中から、必要な情報を見つけていくという地道な解析をしています。手に余るようでしたら、私たちのサポートをご利用ください。)
エラーコードは、アプリケーション ベリファイアのヘルプ ([Help] メニューの [Help]) からも検索できます。
(このヘルプは、C:\Windows\system32\appverif.chm を表示しています。)
さいごに
アプリケーション ベリファイアに、アプリケーションを登録して、一連の操作を実施して、エラー・警告がカウントされていなければ、検証は完了です。
しかしながら、明らかに例外が発生し、アプリケーションが異常終了した時に、ベリファイアのログが残らないことがあります。それは、おそらく、アプリケーションが強制終了されてしまったために、ベリファイアのログ処理も中断されてしまったためと思います。
(改善の余地あり、というところです。新しいバージョンに期待しましょう。)
アプリケーションの開発中は、少しずつ出来上がっていく機能に達成感がありますが、工程スケジュールに追われて疲弊したところに、アプリケーションの検証が待っています。私はモノを作るのが好きでしたが、テストは苦手でした。万能ではないですが、このようなツールがお役に立てば幸いです。
by 〇尾