Debuggerインターフェイス

MozillaのJavaScriptエンジンであるSpiderMonkeyは、Debuggerという名前のデバッグインターフェイスを提供しています。Debuggerは、JavaScriptコードが他のJavaScriptコードの実行を観察して操作できるようにします。Firefoxの組み込みの開発者ツールとFirebugアドオンは、どちらもDebuggerを使用してJavaScriptデバッガを実装しています。しかし、Debuggerは非常に一般的で、トレーサやカバレッジ分析、パッチアンドコンティニューなどの他の種類のツールを実装するために使用できます。

Debugger には3つの基本的な特徴があります。

  • ソースレベルのインターフェイス:これは機械語ではなく、JavaScript言語で動作します。 これは、JavaScriptオブジェクト、スタックフレーム、環境、およびコードで動作し、デバッグ対象が解釈、コンパイル、または最適化されているかどうかにかかわらず一貫したインターフェイスを提供します。 JavaScript言語の強力なコマンドを持っている場合は、言語の実装を見たことがない場合でも、Debuggerを正常に使用するために必要なすべての背景を持つ必要があります。

  • これはJavaScriptコードで使用するためのものです。 JavaScriptはデバッグ言語とツール実装言語の両方であるため、ウェブ上でJavaScriptを有効にする性質は、開発者向けのツールを作成する際に活用できます。 JavaScript APIで予想されるように、Debuggerはサウンドインターフェイスです。DebuggerはGeckoをクラッシュさせるものではありません。 エラーにより、適切なJavaScript例外がスローされます。

  • これはスレッド内デバッグAPIです。 デバッガとDebuggerを使用してそれを観察するコードは、同じスレッドで実行する必要があります。 クロススレッド、クロスプロセス、およびクロスデバイスツールでは、Debuggerを使用して同じスレッド内からデバッグ対象を観察し、必要な通信自体を処理する必要があります。 (Firefoxの組み込みツールには、この目的のために定義されたプロトコルがあります。)

Gecko では、Debugger APIは chrome コードでのみ使用できます。 設計上、セキュリティホールを導入するべきではないので、原則としてコンテンツにも利用できるようにすることができます。追加攻撃のセキュリティリスクを正当化することは困難です。

Debugger API は、現在、自己ホスト型の JavaScript を監視することはできません。 これは API の設計に固有のものではなく、Debugger API が実行できるような侵入の種類に対してセルフホスティングのインフラストラクチャが準備されていないことだけです。

DebuggerインスタンスとShadowオブジェクト

Debuggerは、オブジェクトやプリミティブなどの実際のJavaScript の値だけでなく、通常はオブジェクトとしてアクセスできないスタックフレーム、環境、スクリプト、コンパイルユニットなどの JavaScript の値として、デバッグ対象の状態のあらゆる面を反映します。

タイマーコールバック関数を実行中のJavaScriptプログラムを次に示します。

A running JavaScript program and its Debugger shadows

実行中のJavaScriptプログラムとDebuggerのshadow

この図は Debugger API を構成するさまざまな種類の shadow オブジェクトを示しています(これらはすべて一般的な規則に従います)。

  • Debugger.Objectはdebuggeeオブジェクトを表し、誤ってゲッター、セッター、プロキシトラップなどを呼び出さないようにデバッガーを保護するリフレクション指向のAPIを提供します。

  • Debugger.Scriptは、JavaScriptコードのブロック(関数本体または最上位スクリプト)を表します。 Debugger.Scriptを指定すると、ブレークポイントを設定し、ソース位置とバイトコードオフセット(「ソースレベル」の設計原則からの逸脱)を変換し、コードの他の静的特性を見つけることができます。

  • Debugger.Frameは実行中のスタックフレームを表します。 これらを使ってスタックを参照し、各フレームのスクリプトと環境を見つけることができます。 フレーム上でonStepハンドラとonPopハンドラを設定することもできます。

  • Debugger.Environmentは変数名を格納場所に関連付ける環境を表します。 環境は、実行中のスタックフレームに属しているか、関数クロージャによって取り込まれているか、グローバルオブジェクトのプロパティを変数として反映している可能性があります。

Debuggerインスタンス自体は、デバッグ対象のもののshadowではありません。むしろ、デバッグ対象とみなされるグローバルオブジェクトのセットを維持します。Debuggerは、これらのグローバルオブジェクトのスコープ内で実行される実行のみを監視します。新しいスタックフレームがプッシュされたとき、新しいコードがロードされたときなどに呼び出される関数を設定できます。

この図からは、JavaScriptのコンパイル単位を表すDebugger.Sourceインスタンスは省略されています。Debugger.Sourceは、ソースコードの完全なコピーを提供し、eval<script>要素、またはそれ以外の方法で、コードがシステムにどのように入力されたかを説明することができます。 Debugger.Scriptは、それが派生したDebugger.Sourceを指し示しています。

デバッガのメモリ使用状況を監視するためのメソッドとアクセサを保持するDebuggerDebugger.Memoryインスタンスも省略されています。

これらの型はすべて、一般的な規則に従います。特定の型の仕様を掘り下げる前に目を通す必要があります。

すべてのshadowオブジェクトは、Debuggerごとおよび参照先ごとに一意です。 提供されるDebuggerには、特定のスタックフレームのための1つのDebugger.Frameなど、特定のデバッグ対象オブジェクトを参照する1つのDebugger.Objectがあります。したがって、ツールはshadowの参照先についてのメタデータをshadow自体にプロパティとして格納し、同じ参照先にまたがっている場合にはそのメタデータを再度検索することができます。 また、shadowはDebugger単位であるため、独自のDebuggerインスタンスを使用する他のツールとの干渉を心配することなくツールを実行できます。

自分で試してDebuggerの機能の一部をみることができるものを次に示します。

Gecko固有の機能

DebuggerのコアAPIは、JavaScriptの実装に共通する概念のみを扱いますが、Gecko固有の機能もいくつか含まれています。

  • [Global tracking][global] は、Geckoインスタンスで実行されているすべてのコードのデバッグを「chrome debugging」モデルでサポートしています
  • [Object wrapper][wrapper] 関数は、権限の境界をまたいだオブジェクト参照を操作するのに役立ちます

ソースメタデータ

ファイルから生成:
 
js/src/doc/Debugger/Debugger-API.md
透かし:
sha256:6ee2381145a0d2e53d2f798f3f682e82dd7ab0caa0ac4dd5e56601c2e49913a7
変更セット:
5572465c08a9+

ドキュメントのタグと貢献者

このページの貢献者: silverskyvicto
最終更新者: silverskyvicto,