アプリケーション検証ツール (Windows 7 および Windows Server 2008 R2 のアプリケーション品質クックブック)
影響を受けるプラットフォーム
クライアント - Windows XP、Windows Vista、Windows 7
サーバー - Windows Server 2003、Windows Server 2008、Windows Server 2008 R2
説明
すべての開発の品質ゲートとしてアプリケーション検証ツールを昇格し、適用します。 これには、次のような機能強化が含まれています。
- Windows エラー報告チームがスレッドプールの使用中に発見した問題に対処するための追加チェックを提供しました。
- 64 ビット版の Windows で 32 ビット コンポーネントのテストや一般的な簡略化のニーズなど、Windows 7 の変更に対応するため、32 ビット版と 64 ビット版のパッケージを組み合わせました。
- マルチスレッド アプリケーション、32 ビット アプリケーションを実行する 64 ビット Windows 用の追加のチェック、および多数のバグ修正が含まれます。
これらの変更は、スレッド チェックを有効にしていないユーザーに悪影響を及ぼすことはありません。スレッド チェックを有効にしているユーザーは、既存のスレッド プールの使用に関する問題の検出と診断に関する追加のサポートを受ける必要があります。 スレッド チェックを有効にするかどうかに関係なく、このサービスのその他の機能強化とバグ修正の恩恵を受けることができます。
このサービスを使用するとパフォーマンスが若干低下しますが、小売り環境では通常は実行されないため、メインパフォーマンス レベルは許容範囲にとどまるはずです。
使用方法
一般情報
信頼性の高い Windows アプリケーションを提供するには、次の操作を行います。
- お客様にリリースする前に、デバッガーでアプリケーション検証ツールを使用し、アンマネージド (ネイティブ) コードで記述されたアプリケーションをフルページ ヒープを使用してテストしてください。
- アプリケーション検証ツールで提供されている手順に従って、誤った状態を解決してください。
- アプリケーションが解放されたら、Windows エラー報告によって収集されたアプリケーション エラー レポートを定期的に監視してください。
スレッド プールのチェックは、[基本] チェック見出しの下で既定で有効になっています。 これは既定の設定に含まれているため、ユーザーは、既定の設定でアプリケーション検証ツールをコード上で実行するだけで新しいチェックを活用できます。
詳細
少なくとも、[基本] 設定が選択された状態でアプリケーション検証ツールを実行する必要があります。 これは、WinLogo と WinQual に必要です。 [基本] 設定では、次の項目を確認します。
- 例外の停止の詳細 - 構造化例外処理を使用して、アプリケーションでアクセス違反が非表示にならないようにします
- ハンドルの停止の詳細 - アプリケーションで無効なハンドルが使用されないようにテストします
- ヒープ停止の詳細 - ヒープ内のメモリ破損の問題を確認します
- 入力/出力の停止の詳細 - 非同期 IO の実行を監視し、さまざまな検証を行います
- 漏えい停止の詳細 - dll によって作成され、dll がアンロードされるまで解放されなかったリソースを追跡することで、漏えいを検出します
- ロック停止の詳細 - 重要なセクションの正しい使用法を確認します
- メモリ停止の詳細 - 仮想空間操作用の API が正しく使用されていることを確認します (VirtualAlloc、MapViewOfFile など)
- TLS 停止の詳細 - スレッド ローカル ストレージ API が正しく使用されていることを確認します
- スレッドプールの停止の詳細 - スレッドプール API を正しく使用し、コールバック後のワーカー スレッド状態に一貫性チェックを適用します
アプリケーションを "Vista 以前の" アプリケーションから移行する場合は、"LuaPriv" (UAC チェックとも呼ばれます) を利用することをお勧めします。 制限付きユーザー アカウント特権予測子 (LuaPriv) には、主に次の 2 つの目標があります。
- 予測: 管理特権を持つアプリケーションを実行しているときに、そのアプリケーションが (一般的には通常のユーザーとして) 低い特権で実行された場合も同様に動作するかどうかを予測します。 たとえば、アプリケーションが管理者のみにアクセスを許可しているファイルに書き込む場合、そのアプリケーションが管理者以外として実行されている場合、同じファイルに書き込むことはできなくなります。
- 診断: 管理者以外の特権で実行しているときに、現在の実行で既に存在する可能性がある潜在的な問題を特定します。 前の例の続きで、アプリケーションが、管理者グループ メンバーのアクセスのみを許可するファイルに書き込もうとすると、アプリケーションに ACCESS_DENIED エラーが表示されます。 アプリケーションが正しく動作しない場合、この操作が原因である可能性があります。
LuaPriv は、次の種類の問題を特定します。
潜在的な問題 | 説明 |
---|---|
制限付き名前空間 | 名前空間を使用せずに名前付き同期オブジェクト (イベント、セマフォ、ミューテックスなど) を作成すると、オペレーティング システムで制限付き名前空間にオブジェクトを配置することが選択される場合があるため、オペレーティング システムによっては特権なしでの実行が複雑になる可能性があります。 このようなオブジェクトを制限付き名前空間 (グローバル名前空間など) に作成するには、管理者にのみ付与される SeCreateGlobalPrivilege が必要です。 LuaPriv でこれらの問題が検出された場合、その両方にフラグを設定します。 |
ハード管理者の確認 | アプリケーションによっては、ユーザーのセキュリティ トークンを調べて、そのユーザーにどれだけの特権があるかを確認します。 このような場合、アプリケーションは、ユーザーの能力に応じて動作を変更する可能性があります。 LuaPriv は、この情報を返す API 呼び出しにフラグを設定します。 |
特権の要求 | アプリケーションは、必要な操作を実行する前に、セキュリティ関連の特権 (SeTcbPrivilege や SeSecurityPrivilege など) を有効にしようとする場合があります。 LuaPriv フラグは、セキュリティ関連の特権を有効にしようとします。 |
特権がありません | ユーザーが持っていない特権をアプリケーションが有効にしようとすると、アプリケーションが特権を期待していることが通知され、動作に違いが生じる可能性があります。 LuaPriv フラグが特権の要求に失敗しました。 |
INI ファイルの操作 | マップされた INI ファイル (WritePrivateProfileSection および同様の API) への書き込みを試行すると、管理者以外のユーザーの場合は失敗する可能性があります。 LuaPriv は、このような操作にフラグを設定します。 |
アクセスが拒否されました | アプリケーションがオブジェクト (ファイル、レジストリ キーなど) へのアクセスを試みたが、アクセス権が不十分なため失敗した場合、そのアプリケーションは、それ以上の特権で実行されることが期待されている可能性があります。 LuaPriv は、ACCESS_DENIED と同様のエラーで失敗したオブジェクトを開く試行にフラグを設定します。 |
ACE を拒否する | オブジェクトの DACL に Deny ACE がある場合は、特定のエンティティへのアクセスが明示的に拒否されます。 これは一般的なものではなく、予測が困難になるため、LuaPriv は検出されたときに DENY ACE にフラグを設定します。 |
アクセス制限 | アプリケーションが、通常のユーザーに付与されていない権限のオブジェクトを開こうとした場合 (たとえば、管理者のみが書き込み可能なファイルに書き込もうとしている場合)、通常のユーザーとして実行しても、そのアプリケーションは同じように動作しない可能性が高くなります。 LuaPriv は、このような操作にフラグを設定します。 |
MAXIMUM_ALLOWED | アプリケーションが MAXIMUM_ALLOWED のオブジェクトを開くと、オブジェクトに対する実際のアクセス チェックが他の場所で行われます。 これを行うほとんどのコードは正しく機能せず、特権なしで実行するとほとんどの場合に異なる動作をします。 LuaPriv は、MAXIMUM_ALLOWED のすべてのインシデントにフラグを設定します。 |
一般的に見落とされる問題は、あいまいなその他のチェックでキャプチャされます。
- 危険な API の停止の詳細
- ダーティ スタックの停止の詳細
- タイム ロールオーバー
新しい印刷検証ツールが追加されました。 このレイヤーは、アプリケーションでの印刷サブシステムの呼び出し時に発生する可能性がある問題を検出してトラブルシューティングするのに役立ちます。 印刷検証ツールは、印刷サブシステムの 2 つのレイヤーである PrintAPI レイヤーと PrintDriver レイヤーを対象としています。
印刷 API レイヤー
印刷検証ツールでは、プログラムと Winspool.drv と prntvpt.dll の間のインターフェイスのテストが行われ、それらの DLL のインターフェイスをテストします。
印刷ドライバー レイヤー
Print Verifier では、UNIDRV.DLL、UNIDRUI.DLL、PSCRIPT5.DLL、PS5UI.DLL、MXDWDRV.DLL などのコア印刷ドライバーと印刷ドライバー プラグインとの間のインターフェイスのテストも行われます。
これらのチェックの一部は Windows 7 専用であり、他のチェックは Windows 7 でのみパフォーマンスが向上します。
通常、デバッグ バージョンのみでアプリケーション検証ツールが実行されるため、パフォーマンスは通常問題になりません。 このアプリケーション検証ツール チェックまたは他のアプリケーション検証ツール チェックの使用によってパフォーマンスの問題が発生した場合は、必要なすべてのチェックを実行するまで、一度に 1 つずつチェックを実行します。
Windows システムでのアプリケーション クラッシュのほぼ 10% がヒープの破損によるものです。 これらのクラッシュは、事後にデバッグすることはほぼ不可能です。 これらの問題を回避する最善の方法は、アプリケーション検証ツールで見つかったページ ヒープ機能を使用してテストすることです。 ページ ヒープには、「フル」と「ライト」の 2 つのフレーバーがあります。フルが既定で、これは、破損が検出されると即座にデバッガーが停止されます。 この機能は、デバッガーの下で実行する必要があります。 ただし、リソースを最も使用する方法でもあります。 ユーザーがタイミングの問題を抱え、既に "フル" ページ ヒープの下でシナリオを実行している場合は、"ライト" に設定すると、これらの問題が対処される可能性があります。 さらに、ライト ページ ヒープは、プロセスが終了するまでクラッシュしません。 割り当てにスタック トレースが提供されますが、同等のフルを利用するよりも診断にかなり時間がかかる場合があります。
Winqual Web ポータルを介して、アプリケーションの信頼性の状態を監視します。 このポータルには、Windows エラー報告を介して収集されたエラー レポートが表示されるため、最も頻繁に発生するエラーを簡単に特定できます。 この詳細については、「Windows エラー報告: はじめに」をご覧ください。 Microsoft は、このサービスに対して課金を行いません。
WinQual を利用するには、次の操作を行う必要があります。
- VeriSign ID が必要な WinQual に会社を登録します。 Windows Vista SP1 \ Windows Server 2008 でグループ化された開発者ポータルで、WinQual に関する Windows 7 の情報を確認できます。 近日中に Windows 7 の位置情報に対応する予定です。
- ISV アプリケーションを製品名と ISV 名にマップし、エラー レポートを会社にリンクします。 他の ISV では、エラー レポートを表示できません。
- ポータルを使用して、上位の問題を特定します。 ISV は、障害発生後にとるべき手順を顧客に通知する応答を作成することもできます。 応答システムは、世界中の 10 か国語以上の言語をサポートしています。
その他の注意点: アプリケーション検証ツールは、それを実行するコード パスと同程度しか機能しません。 このツールとコード カバレッジ ツールを組み合わせる価値は、いくら評価しても過大評価にはなりません。
その他のリソースへのリンク
Windows 用デバッグ ツール:
アプリケーション検証ツール:
Microsoft Visual Studio 2008 または .NET Framework 3.5 向けアプリケーション検証ツール
注: Visual Studio に付属するアプリケーション検証ツールのバージョンはかなり古いものです。 可能であれば、代わりにスタンドアロン パッケージを使用してください。 このため、今後のバージョンの Visual Studio では、アプリケーション検証ツールが埋め込まれなくなります。
WinQual: