Windows SDK ツール:Application Verifier のご紹介

前回は Windows SDK ツールそのものをご案内いたしましたが、今回は、それに同梱されている Application Verifier (アプリケーション ベリファイア) についてご紹介しましょう。

アプリケーション ベリファイアは、アプリケーションが、ある程度完成した段階で、検証のために使用し、内在しているかもしれない問題を検出してくれるツールです。
メモリ リークの検出には LeakDiag ツール、ヒープメモリに関する検出には DebugDiagPageHeap ツールなどがありますが、アプリケーション ベリファイアは、いろいろな検証項目をまとめた便利ツールでもあります。デバイス ドライバーを開発される方なら、ドライバー ベリファイアの名前をご存じかもしれません。今回は、アプリケーション側の検証ツールです。

どこにインストールされているの?

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 〇尾