アプリケーション検証ツール - アプリケーションのテスト
アプリケーション検証ツール (AppVerifier) は、アンマネージド コード用のランタイム検証ツールであり、通常のアプリケーション テスト手法では識別が困難な、わずかなプログラミング エラー、セキュリティの問題、制限ユーザー アカウントの特権の問題を見つけるのに役立ちます。
信頼性の高い Windows アプリケーションを提供するには、次の操作を行います。
- お客様にリリースする前に、デバッガーでアプリケーション検証ツールを使用し、アンマネージド (ネイティブ) コードで記述されたアプリケーションをフルページ ヒープを使用してテストしてください。
- アプリケーション検証ツールで提供されている手順に従って、誤った状態を解決してください。
- アプリケーションがリリースされたら、Windowsエラー報告などによって収集されたアプリケーション エラー レポートを定期的に監視します (使用可能な場合)。
スレッド プールのチェックは、[基本] チェック見出しの下で既定で有効になっています。 これは既定の設定に含まれているため、ユーザーは既定の設定でコードに対してアプリケーション検証ツールを実行するだけで、これらのチェックやその他の重要なチェックを活用できます。
アプリケーション検証ツールの構成
デバッガーのセットアップ
検証対象のアプリケーションはユーザー モード デバッガーで実行する必要があります。エラーが発生するとデバッガーに分割されるため、システムはカーネル デバッガーで実行する必要があります。 デバッガーの詳細については、「アプリケーション検証ツール - アプリケーション検証ツールの停止のデバッグ」を参照してください。
設定
実行中のプロセスに対してアプリケーション検証ツールを有効にすることはできません。 その結果、以下の説明に従って設定を行い、アプリケーションを起動する必要があります。 設定は、明示的に削除されるまで永続的です。 そのため、アプリケーションを何回起動しても、設定が削除されるまで AppVerifier を有効にして起動します。
アプリケーション検証ツールの基本テストの使用
以下のシナリオは、推奨されるコマンド ラインとユーザー インターフェイスのオプションを示しています。 これらは、完全なカバレッジを確保するために、コードを実行するすべてのテスト中に実行する必要があります。 これらのシナリオでは、アプリケーションがデバッガーに分割されず、すべてのテストが AppVerifier を有効にせずに実行した場合と同じパス レートで合格することが期待されます。
使用してテストするアプリケーションの検証ツールを有効にします。 コマンドラインから: appverif /verify MyApp.exe
ユーザー インターフェイスから: アプリケーション領域内を右クリックし、[アプリケーションの追加] を選択して、アプリケーションを追加します。 [テスト] 領域から [基本] を選択します。 [保存] ボタンをクリックします。
注:
/verify を使用すると、基本テストが有効になります
DLL をテストする場合は、DLL を実行しているテスト実行可能ファイルに対してアプリケーション検証ツールを有効にする必要があります。
検証レイヤーを個別に実行します。 たとえば、あるセッションですべての基本を有効にし、別のセッションですべての LuaPriv チェックを有効にします。
アプリケーションを実行するすべてのテストを実行します。
発生したデバッガーの中断を分析します。 中断が発生した場合は、それを理解して修正する必要があります。 注: ヘルプの内容には、中断とその調査方法に関する詳細が表示されます。
完了したら、すべての設定を削除します。 コマンドラインから: appverif /n MyApp.exe
ユーザー インターフェイスから、アプリケーション領域内を右クリックし、[アプリケーションの削除] を選択して、アプリケーションを削除します。 そして、[保存] ボタンをクリックします。
ヒープの破損
Windows システムでのアプリケーション クラッシュのほぼ 10% がヒープの破損によるものです。 これらのクラッシュは、事後にデバッグすることはほぼ不可能です。 これらの問題を回避する最善の方法は、アプリケーション検証ツールで見つかったページ ヒープ機能を使用してテストすることです。 ページ ヒープには、「フル」と「ライト」の 2 つのフレーバーがあります。フルが既定で、これは、破損が検出されると即座にデバッガーが停止されます。 この機能は、デバッガーの下で実行する必要があります。 ただし、リソースを最も使用する方法でもあります。 ユーザーがタイミングの問題を抱え、既に "フル" ページ ヒープの下でシナリオを実行している場合は、"ライト" に設定すると、これらの問題が対処される可能性があります。 さらに、ライト ページ ヒープは、プロセスが終了するまでクラッシュしません。 割り当てにスタック トレースが提供されますが、同等のフルを利用するよりも診断にかなり時間がかかる場合があります。
AppVerifier 低リソース シミュレーション (フォールト インジェクション) の使用
このシナリオの期待は、アプリケーションがデバッガーに分割されないことです。 デバッガーに侵入しないことは、対処する必要があるエラーがないことを意味します。
ランダムフォールトインジェクションが通常の操作に導入されるため、テストの合格率が大幅に低下する可能性があります。
アプリケーションのアプリケーション検証ツールの低リソース シミュレーション (フォールト インジェクション) を有効にします。 コマンドラインから: Appverif /verify MyApp.exe /faults
ユーザー インターフェイスから: アプリケーション領域内を右クリックし、 [アプリケーションの追加] を選択して、アプリケーションを追加します。 [テスト] 領域から [低リソース シミュレーション] を選択します。 [保存] ボタンをクリックします。
注: DLL をテストする場合は、プロセス全体ではなく、特定の DLL に低リソース シミュレーション (フォールト インジェクション) を適用できます。 コマンド ライン形式は次のようになります。
appverif /verify TARGET [/faults [PROBABILITY [TIMEOUT [DLL …]]]]
例:
appverif /verify mytest.exe /faults 50000 1000 d3d9.dll
アプリケーションを実行するすべてのテストを実行します
発生したデバッガーの中断を分析します。 中断が発生した場合は、それを理解して修正する必要があります。
完了したら、すべての設定を削除します。 コマンド ラインから: appverif /n MyApp.exe。 ユーザー インターフェイスから: アプリケーション領域内を右クリックし、[アプリケーションの削除] を選択して [保存] ボタンをクリックして、アプリケーションを削除します。
注: 障害挿入の有無にかかわらず実行すると、アプリケーションのコード パスが大きく異なるため、AppVerifier の利点を最大限に活用するには、両方のシナリオを実行する必要があります。
WOW64 でのアプリケーション検証ツールの使用
32 ビットバージョンまたは 64 ビット バージョンのアプリケーション検証ツールを使用して、WOW64 で実行されている 32 ビット アプリケーションを確認できます。
AppVerifier データの分析
AppVerifier 分析中に作成されたすべてのデータは、バイナリ形式で %U Standard Edition RPROFILE%\AppVerifierLogs フォルダーに格納されます。 これらのログは、ユーザー インターフェイスまたはコマンド ラインを使用して XML に変換して、さらに分析できます。
XML ファイルを表示するには、任意のツールを使用して XML を表示できます。たとえば、Microsoft Excel へのインポート - Xml ファイルを Excel にインポートし、フィルターまたはピボット テーブルを使用して収集されたデータを再構成および分析できます。
コマンド ラインの使用
アプリケーション検証ツールは、UI またはコマンド ライン オプションを使用して使用できます。
コマンド ラインの使用方法の例を次に示します (以下に詳細を示します)。
appverif /verify TARGET [/faults [PROBABILITY [TIMEOUT [DLL …]]]]
appverif /verify notepad
appverif -enable LAYER … -for TARGET ... [-with [LAYER].PROPERTY=[VALUE] …]
appverif -disable LAYER ... -for TARGET ...
appverif -query LAYER ... -for TARGET ...
appverif –configure STOP ... -for TARGET ... [-with STOPPROPERTY=[VALUE] …]
appverif –logtofile {enable|disable}
2 つのアプリケーションの特定の検証レイヤーに対してアプリケーション検証ツールを有効にするには:
appverif –enable Heaps Locks –for notepad.exe iexplore.exe
プロパティ X.DebugLevel と Y.DebugLevel を使用してターゲット test.exeに対して X と Y という名前の 2 つのレイヤーを有効にするには:
appverif –enable X Y –for test.exe –with X.DebugLevel=1 Y.DebugLevel=2
すべてのチェックを無効にするには、アプリケーションで実行します。
appverif -disable * -for notepad.exe
OR
appverif -delete settings -for notepad.exe
すべてのプロセスに対してアプリケーション検証ツールのログ記録をグローバルに有効または無効にするには:
appverif –logtofile enable
appverif –logtofile disable
ログ記録は、すべてのプロセスに対して既定で有効になっています。
アプリケーション検証ツールのコマンド ライン構文
アプリケーション検証ツールのコマンド ラインの使用方法:
-enable TEST ... -for TARGET ... [-with [TEST.]PROPERTY=VALUE ...]
-disable TEST ... -for TARGET ...
-query TEST ... -for TARGET ...
-configure STOP ... -for TARGET ... -with PROPERTY=VALUE...
-verify TARGET [-faults [PROBABILITY [TIMEOUT [DLL ...]]]]
-export log -for TARGET -with To=XML_FILE [Symbols=SYMBOL_PATH] [StampFrom=LOG_STAMP] [StampTo=LOG_STAMP] [Log=RELATIVE_TO_LAST_INDEX]
-delete {logs|settings} -for TARGET ...
-stamp log -for TARGET -with Stamp=LOG_STAMP [Log=RELATIVE_TO_LAST_INDEX]
-logtoxml LOGFILE XMLFILE
-installprovider PROVIDERBINARY
-sppath [PROTECTED_PROCESS_LOG_PATH]
-cppath
-logtofile [enable | disable]
コマンド ライン構文は、1 つ以上のレイヤーを受け入れ、レイヤーの省略可能なプロパティ指定子を持つ 1 つ以上のターゲットに適用します。
appverif -enable LAYER ... -for TARGET ... [-with [LAYER].PROPERTY=[VALUE] …]
appverif -disable LAYER ... -for TARGET ...
appverif -query LAYER ... -for TARGET ...
appverif –configure STOP ... -for TARGET ... [-with STOPPROPERTY=[VALUE] …]
どこで:
LAYER は、検証レイヤーの標準名です。 新しい検証ツール プロバイダーがインストールされている場合、コマンド ラインで使用される新しい検証レイヤー名が公開されます。 レイヤーの例として、ヒープ、ハンドル、またはロックがあります。
LAYER を * に設定すると、コマンドがすべてのレイヤーに適用されることを指定できます。
TARGET はバイナリ名 (例: notepad.exe) です。 これはレジストリに保持される静的設定であり、アプリケーションが起動されるたびに考慮されます。 appverif –disable コマンドでは、TARGET を * に設定して、すべてのターゲットを無効にするように指定できます。
PROPERTY は、コマンド ラインにメンション LAYER に固有のプロパティ名です。 たとえば、Handles レイヤーにはプロパティとしてトレースがあります。
VALUE は プロパティの値です。 値の型は、プロパティに関連付けられている型によって異なり、適用されます。 現時点でサポートされている型は、ブール値 (true/false)、整数 (C 表記の 10 進数/8 進数/16 進数)、文字列、および複数文字列 (\0\0' \0’ between strings and being terminated by
を含む ) です。 VALUE が指定されていない場合、ユーザーはそのプロパティを削除し、動作をプロパティの既定値に戻す必要があることを意味します。
STOP は、構成する検証ツールの停止問題の数値 (10 進数または C 表記の 16 進数) です。 ストップ コードは一意である必要があります (同じストップ コードを使用できるレイヤーが 2 つないため、ツール自体がストップが属するレイヤーを決定します)。
STOPPROPERTY は、検証ツールの停止に使用できるプロパティ名です。 値が指定されていない場合は、プロパティを削除する必要があると見なされます。 ストップに許可されるプロパティは次のとおりです (詳細については、以下の検証機能の停止の構成を参照してください)。
- ErrorReport
- 重要度
- Flavor
プロパティは、必要に応じて、そのプロパティが属するレイヤーによって修飾できます。 ただし、コマンド ラインで 1 つのレイヤーのみを有効にする場合は、この操作は必要ありません。 たとえば、X.DebugLevel プロパティと Y.DebugLevel プロパティを持つターゲット test.exeに対して X と Y という名前の 2 つのレイヤーを有効にするには、次のコマンドを実行します。
appverif –enable X Y –for test.exe –with X.DebugLevel=1 Y.DebugLevel=2
ただし、レイヤー X が有効になっている場合は、修飾されていないプロパティ名を使用できます。
appverif –enable X –for test.exe –with DebugLevel=1
プロパティ名と値の間の区切り文字には、 =
(等号) または :
(コロン) を指定できます。
その他のコマンド
appverif –query providers
appverif –delete logs –for TARGET ...
appverif –delete settings –for TARGET ...
レジストリから完全に TARGET を消去します。
appverif –stamp log –for Target –with Stamp=”LOG_STAMP”[Log= RELATIVE_TO_LAST_INDEX]
このコマンドは、ログにLOG_STAMPをスタンプします。 このスタンプは、ログを XML 形式で表示するときに、ログのセクションのみを関連として識別するのに役立ちます。
appverif –export log –for TARGET –with To=XML_FILE[Symbols=SYMBOL_PATH][Stamp=LOG_STAMP][StampTo=LOG_STAMP][Log=RELATIVE_TO_LAST_INDEX]
上記のコマンドを実行すると、バイナリ ログが xml ファイルにエクスポートされます。 省略可能な Stamp プロパティは、ログのどの部分を XML にエクスポートするかを識別するために使用されます。 指定しない場合、ログ全体が変換されます。 Log プロパティには、可能な限り負の整数があり、最後のログ ファイルから変換する必要があるログ ファイルを示します (プロパティが存在しない場合に想定されます)。 たとえば、notepad.exeを 3 回連続して起動します。 作成された最初のログにアクセスするには、コマンド ラインで Log=-2 を指定します。
コマンド ラインのショートカット
ショートカットは次のとおりです。
appverif /verify TARGET [/faults [PROBABILITY [TIMEOUT [DLL …]]]]
どこで:
TARGET は、上記と同じ意味を持ちます。
確率は、障害を挿入する確率です。 0~1000000 の範囲内の値にする必要があります。 指定しない場合は、既定値は 5%です。
TIMEOUT は、エラー挿入が発生しないプロセスの起動中のミリ秒単位の時間間隔です。 これは、エラーが発生する前にプロセスを適切に起動できるようにするために行われます。 指定しない場合、値は 500 ミリ秒です。
DLL は、プロセスに読み込まれるモジュールの名前です。 通常、これは動的ライブラリ (拡張.dll) の名前ですが、ActiveX (拡張子 .ocx) またはその他の読み込み可能なモジュールを指定できます。
例 :
appverif /verify notepad.exe /faults 100000 1000 msvcrt.dll
(起動時に) notepad.exeのフォールト インジェクションを有効にします。 エラーは確率 10% で発生する必要があります。プロセスの起動後は 1000 ミリ秒で、msvcrt.dllから開始された操作に対してのみ発生します。
フォールト挿入の詳細の有効化
/faults コマンド ラインを使用すると、OLE_ALLOCとHEAP_ALLOCに対する障害の挿入が有効になります。 ただし、コマンド ラインを使用して、有効にする障害挿入の種類を構成できます。 たとえば、レジストリまたはファイル API にエラーを 2% として挿入する場合は、コマンド ラインを使用します。
appverif -enable lowres -for hello.exe -with registry=20000 file=20000
別の例を示します。
appverif -query lowres -for hello.exe
Settings for hello.exe:
Test [lowres] enabled.
Include = *
Exclude =
TimeOut = 2000 (0x7D0)
WAIT = 0 (0x0)
HEAP_ALLOC = 20000 (0x4E20)
VIRTUAL_ALLOC = 0 (0x0)
REGISTRY = 20000 (0x4E20)
FILE = 20000 (0x4E20)
EVENT = 0 (0x0)
MAP_VIEW = 0 (0x0)
OLE_ALLOC = 20000 (0x4E20)
STACKS = false
検証ツールの停止の構成
コマンド ライン (またはユーザー インターフェイス) を使用して、検証ツールの停止を構成できます。 活用する例を次に示します。
Appverif -configure STOP ... -for TARGET ... -with PROPERTY=VALUE ...
STOP は、0x200 0x201などの停止コードです
TARGET は、foo.exeなどのアプリケーション名です
PROPERTY には、"ErrorReport"、"Severity"、および "Flavor" のいずれかを指定できます。
ErrorReport の場合、VALUE には次の値の組み合わせを指定できます。
0x00000001停止がアクティブであることを意味します。 (このビットが 0 の場合は、停止が無効になっていることを意味します)
0x00000020は、ブレークポイントを使用して停止がデバッガーに中断されることを意味します。
0x00000040は、検証ツール例外を生成することによってデバッガーへの中断を停止することを意味します。
0x00000080は、停止がログ ファイルに記録されることを意味します。
0x00000100は、この停止のスタック トレースがログ ファイルに記録されることを意味します。
Severity の場合、 VALUE は次のいずれかになります。
0x00000003情報停止。
0x0000000F警告。
0x0000003F エラー。
Flavor の場合、Value には次の値の組み合わせを指定できます。
0x00000002 非連続停止。
0x00000010このストップは 1 回だけ表示されます。 テストの実行中、次の時間は無視されます。
たとえば、停止0x2700を無効にし、foo.exeの0x2701
Appverif –configure 0x2700 0x2701 –for foo.exe –with ErrorReport=0
停止コード 0x2700をデバッガーに分割 (既定ではオフ) として構成し、スタック トレースなしでログを保存し、コンティニュアブルにしない
Appverif –configure 0x2700 –for foo.exe –with ErrorReport=0xA1 Flavor=0x2
検証ツールの停止オプション - 詳細設定
アプリケーション検証ツールには、検証ツールの停止ごとに変更できる高度な設定 (非アクティブ化など) があります。
検証ツール停止オプションへのアクセス - 検証ツール停止オプションは、使用可能なオプションを一覧表示するダイアログで変更されます。 検証ツールの停止オプションにアクセスするには:
- [テスト] ウィンドウでテストの名前を選択します。
- [編集] メニューの [検証ツールの停止オプション] を選択するか、テストを右クリックして [検証ツールの停止オプション] を選択します。
検証ツールの停止オプション
停止コードをクリックすると、検証ツールの停止ごとに次の要素を変更できます (クリックすると停止の説明が表示されることに注意してください)。
[非アクティブ] はチェックボックスで、オンにすると検証ツールによってコードの実行が停止されます。
重大度によって、検証ツールの停止にフラグを設定する方法が決まります。
- Ignore
- 情報
- 警告
- エラー
エラー報告は、特定の検証ツールの停止を報告またはログに記録する方法を決定します。
[ファイルにログを記録する] - 選択した場合に指定されたファイルにログを記録するチェックボックス。
[ログ スタック トレース] - 選択すると、スタック トレースが使用可能になったときにログに記録されるチェック ボックス。
中断なし - デバッガーで中断しないオプション。
例外 - 中断とブレークポイントなしのオプション
ブレーク ポイント - ブレークまたは例外なしのオプション。
その他には 2 つのオプションがあります
[1 回停止] - 選択すると、アプリケーションのテスト時にそのエラーが 1 回だけ停止するチェックボックス。
[コンティニュアブルではない] - 選択した場合に調査せずに続行できないチェックボックス。
参照
アプリケーション検証ツール - アプリケーション検証ツール内のテスト