Share via


JavaScript拡張機能のネイティブ デバッガー オブジェクト - 設計とテストに関する考慮事項

このトピックでは、JavaScript 拡張機能でネイティブ デバッガー オブジェクトを使用する場合の設計とテストの考慮事項について説明します。

ネイティブ デバッガー オブジェクトは、デバッガー環境のさまざまなコンストラクトと動作を表します。 オブジェクトを JavaScript 拡張機能に渡したり、取得したりして、デバッガーの状態を操作できます。

デバッガー オブジェクトの JavaScript 拡張機能の詳細については JavaScript 拡張機能のネイティブ デバッガー オブジェクト」を参照してください。

JavaScript の使用に関する一般情報については JavaScript デバッガー スクリプトを参照してください.

デバッガー データ モデルの設計に関する考慮事項

設計原則

デバッガー拡張機能に、検出可能、クエリ可能、スクリプト可能な情報を表示するには、次の原則を検討してください。

  • 情報は、必要な場所に近い場所にあります。 たとえば、レジストリ キーに関する情報は、レジストリ キー ハンドルを含むローカル変数の一部として表示する必要があります。
  • 情報は構造化されています。 たとえば、レジストリ キーに関する情報は、キーの種類、キー ACL、キー名、値などの個別のフィールドに表示されます。 つまり、テキストを解析せずに個々のフィールドにアクセスできます。
  • 情報は一貫性があります。 レジストリ キー ハンドルに関する情報は、ファイル ハンドルに関する情報と可能な限り同様の方法で表示されます。

これらの原則をサポートしないこれらのアプローチは避けてください。

  • 単一のフラットな「キッチンシンク」にあなたのアイテムを構造化しないでください。 整理された階層を使用すると、ユーザーは、探しているものを事前に知らずに探している情報を参照し、検出可能性をサポートできます。
  • 従来の dbgeng 拡張機能は、未加工のテキストの画面を出力しながらモデルに移動するだけで変換しないでください。 これは他の拡張機能では作成できず、LINQ 式ではクエリを実行できません。 代わりに、データを個別のクエリ可能なフィールドに分割します。

名前付けのガイドライン

  • フィールドの大文字と小文字は PascalCase にする必要があります。 jQuery など、別の大文字と小文字で広く知られている名前については、例外を考慮できます。
  • 通常は C++ 識別子で使用されない特殊文字は使用しないでください。 たとえば、"Total Length" (スペースを含む) や "[size]" (角かっこを含む) などの名前は使用しないでください。 この規則により、これらの文字が識別子の一部として許可されていないスクリプト言語の使用が容易になり、コマンド ウィンドウからの使用も容易になります。

組織と階層のガイドライン

  • デバッガー名前空間の最上位レベルを拡張しないでください。 代わりに、情報が最も関連性の高い場所に表示されるように、デバッガーで既存のノードを拡張する必要があります。
  • 概念を複製しないでください。 デバッガーに既に存在する概念に関する追加情報を一覧表示するデータ モデル拡張機能を作成する場合は、新しい情報に置き換えるのではなく、既存の情報を拡張します。 言い換えると、モジュールに関する詳細を表示する拡張機能では、モジュールの新しいリストを作成するのではなく、既存の ジュール オブジェクトを拡張する必要があります。
  • 空き浮動ユーティリティ コマンドは Debugger.Utility 名前空間の一部である必要があります。 また、サブ名前空間も適切に設定する必要があります ( Debugger.Utility.Collections.FromListEntryなど)。

下位互換性と重大な変更

発行されたスクリプトは、それに依存する他のスクリプトとの互換性を損なわないはずです。 たとえば、関数がモデルに発行された場合は、可能な限り、同じ場所と同じパラメーターでメインする必要があります。

外部リソースの使用禁止

  • 拡張機能は、外部プロセスを生成してはなりません。 外部プロセスはデバッガーの動作を妨げる可能性があり、さまざまなリモート デバッガー シナリオ (dbgsrv remotes、ntsd remotes、"ntsd -d remotes" など) で誤動作します。
  • 拡張機能では、ユーザー インターフェイスを表示することはできません。 ユーザー インターフェイス要素の表示は、リモート デバッグシナリオでは正しく動作しません。また、コンソールのデバッグ シナリオが壊れる可能性があります。
  • 拡張機能では、文書化されていないメソッドを使用してデバッガー エンジンまたはデバッガー UI を操作することはできません。 これにより、互換性の問題が発生し、異なる UI を持つデバッガー クライアントで正しく動作しません。
  • 拡張機能は、文書化されたデバッガー API を介してのみターゲット情報にアクセスする必要があります。 win32 API を使用してターゲットに関する情報にアクセスしようとすると、多くのリモート シナリオや、セキュリティ境界を越えた一部のローカル デバッグ シナリオでも失敗します。

Dbgeng 固有の機能を使用しない

拡張機能として使用することを目的としたスクリプトは、可能な限り dbgeng 固有の機能 ("クラシック" デバッガー拡張機能の実行など) に依存してはなりません。 スクリプトは、データ モデルをホストするデバッガーの上で使用できる必要があります。

デバッガ拡張機能のテスト

拡張機能は、さまざまなシナリオで動作することが期待されます。 一部の拡張機能はシナリオ (カーネル デバッグ シナリオなど) に固有の場合があります。ほとんどの拡張機能は、すべてのシナリオで動作するか、サポートされているシナリオを示すメタデータを持つ必要があります。

カーネル モード

  • ライブカーネルデバッグ
  • カーネルダンプのデバッグ

ユーザー モード

  • ライブユーザーモードデバッグ
  • ユーザーモードダンプのデバッグ

さらに、これらのデバッガーの使用シナリオを検討してください

  • マルチプロセス デバッグ
  • マルチセッション デバッグ (ダンプ + 1 つのセッション内のライブ ユーザーなど)

リモート デバッガーの使用

リモート デバッガーの使用シナリオで適切な操作をテストします。

  • dbgsrv remotes
  • ntsd remotes
  • ntsd -d remotes

詳細については CDB および NTSD を使用したデバッグ 」および「 プロセス サーバーのアクティブ化」を参照してください。

回帰テスト

デバッガーの新しいバージョンがリリースされると、拡張機能の機能を検証できるテスト自動化の使用を調査します。

関連項目

JavaScript 拡張機能のネイティブ デバッガー オブジェクト

JavaScript 拡張機能のネイティブ デバッガー オブジェクト - デバッガー オブジェクトの詳細

JavaScript デバッガー スクリプト

JavaScript デバッガーのスクリプト例