この記事は Venkman 入門 から始まる一連の Venkman 記事の続きです。
いずれの言語であれ、「ブレークポイント」の設定はデバッグの基本作業として挙げられます。ブレークポイントとは、コード中で実行が停止されるところのことです。 Venkman のようなデバッグツールによってブレークポイントを設定すると、変数、オブジェクトあるいは他の実効状態を確認するために一時停止できるようになるのです。
この記事には JavaScript におけるブレークポイントの説明と Venkman でブレークポイントを設定および確認する方法が書かれています。
この和訳記事は Mozilla に訳者 dynamis が作成している日本語版 Venkman をインストールした環境を使って書かれており、文中の訳語や和訳と同時に撮り直したスクリーンショットなどはすべてそれに応じたものとなっております。従って、内容的な影響は一切ないものの、細部では原文と異なる所がありますのでご了承ください。
最新の日本語版 Venkman やその他 Venkman に関する日本語情報については Venkman-JP をご覧ください。
基本的ブレークポイント
停止ボタンや debugger
キーワードも JavaScript デバッガの便利な機能ですが、コードの奥深くまでデバッグするのであれば — 特に自身が記述しトラブルシューティングの責任もあるコードであれば — ブレークポイントが必要となります。
ブレークポイントの種類
Venkman には 2 種類のブレークポイントがあります。まず 1 つ目の、最も一般的なものは、「実 (hard)」ブレークポイントというものです。実ブレークポイントはコンパイル済関数の擬似コードに含まれる、実際のトラップ命令のことを表しています。実ブレークポイントは現在ブラウザに「存続中」である関数の中にしか存在できません。実ブレークポイントはプログラムの実行を実際に停止させるもののことです。
2 つ目のブレークポイントである「予定 (future)」ブレークポイントというのは、可能な限り速やかに実ブレークポイントを設定するという Venkman による約束を表します。予定ブレークポイントは、まだコンパイルされていないスクリプト中で停止したい時に使用されます。予定ブレークポイントの最も一般的な用法は、「トップレベル」スクリプト (すべての関数の外側で実行されるスクリプト) あるいはページの onLoad イベント中で実行されるスクリプト中で停止するものです。予定ブレークポイントの URL にマッチするスクリプトが読み込まれ、指定行に実行可能なコードが含まれると、Venkman は自動的に実ブレークポイントを設定します。【訳注: 原文では予定ブレークポイントを設定すると書かれていますが、誤りでしょう】
この違いを除き、Venkman のブレークポイントは他の多くのデバッガでのブレークポイントと同様に機能します。ソースコードビューの左余白部に表示される負号はその行が実行可能なコードを含んでおり、実ブレークポイントを設定できるところであることを示しています。
ブレークポイントの設定
ソースコードビューにあるこれらの負号をクリックするとその行にブレークポイントを設定できます。 Venkman は当該行が実行される前に停止します。ブレークポイントが設定されると、余白部は図 2 にあるように「B」という文字に変わります。このブレークポイントの設定後にこのコードを再度実行すると Venkman は 112 行目で停止します。
Venkman は 1 つ以上のブレークポイントが設定されていることを、設定されているファイルの横に赤い点を表示させることで、読み込まれているスクリプトビューでも示します。コードが停止される関数の開始行番号も横に表示されます。各非接続用法関係代名詞以降は追加説明的なものだから訳もそれらしくした
ブレークポイントによるデバッグ
ブレークポイントを設定することは、実行環境に関する情報を Venkman (あるいは何であれご利用のデバッガ) が表示できるようにすることになります。スクリプトやソフトウェアプログラムをデバッグする上で最も重要なものとして、スクリプトの実行過程で変化する変数 — 関数は値、エラー、カウンタ、変数のスコープを返す — を確認できることが挙げられます。as 以降は理由だが単に説明として訳、aspect はデバッグの重要な側面→デバッグの仕方で重要なところ→デバッグに於いて大事なもの…と解釈
例えば図 1 の DownloadButton
関数では、ダウンロードボタンによってどの種のビルドが得られるようにするか判断するために変数 type
を使用しています。プラットフォームは Windows であると関数が判断したときにその変数が調べられる行である、112 行目にブレークポイントを設定してみます。そしてメインブラウザでウェブページを再読込すると、DownloadButton
関数に入った時に実行が停止されることを確認できます。そこで停止し、type
変数の値が milestone
であると「ローカル変数ビュー」に表示されるのです。一般の you や we ではないが冗長であるから主語 Venkman を省略(一般主語の受動態に)【訳注: Windows プラットフォームでナイトリービルドでないブラウザによって読み込んだときの挙動】
ブレークポイントと対話ビューを用いて、Venkman の表示する変数の値を(【訳注: コードを実際に変更することなく】 デバッグ環境自体のコンテクスト中でのみ) 変更し、これらの変更がコードの実行にどのように影響するか調べることができます。
このようにブレークポイントで停止時に Venkman で可能な操作について詳しくは Venkman 紹介記事の デバッグの基本 節をご覧ください。
ブレークポイントの削除
ブレークポイントを削除するには、当該余白部を二度クリックします。1 度目のクリックでは実ブレークポイントが削除され、予定ブレークポイントだけが残されます。この状態は黄色の「F」という文字で表されます。2 度目のクリックにより予定ブレークポイントも削除されます。
高度なブレークポイント
Venkman ではブレークポイントとスクリプトを関連づけることができます。当該ブレークポイントに出会うと実行中の関数のスコープで実行されるスクリプトを指定できるのです。分かりにくいので若干独自表現にこの高度な機能や関連づけられるスクリプトに関する他のオプションは、ブレークポイントの右クリックからアクセスできる、ブレークポイントのプロパティダイアログで指定できます。
関連づけられたブレークポイントに出会った時に実行されるスクリプトを作成する場合には、Venkman が関連づけられたスクリプトの出力をどう扱うか決定する様々なオプションをブレークポイントのプロパティダイアログから選択できます。
- 結果に依らず続行 を選ぶと Venkman はブレークポイントスクリプトの処理後に通常の実行を続けます。これは追加コードを手早く試してみる際に便利です。
- 結果に依らず停止 を選ぶと Venkman はブレークポイントスクリプトの処理後に実行を停止し、プログラムの状態を詳しく調べることができるようにします。
- 結果が真の場合に停止 を選ぶと条件付きブレークポイントになります。ブレークポイントスクリプトが真の値(厳密に真偽値
true
である必要はなく、null
でも空文字列でもゼロでも未定義でも真偽値false
でもない任意の値)を返すと通常通り実行が続けられます。一方、ブレークポイントスクリプトが偽の値を返すと Venkman はその時点で実行を停止します。 - 結果をその場で呼び出し元に返す を選ぶと、ブレークポイントの設定された関数がブレークポイントスクリプトの完了後直ぐにブレークポイントスクリプトの値を関数自身の結果として返すようになります。
- 例外を呼び出し元に渡す チェックボックスにより、ブレークポイントスクリプトにより投げられた例外を直接呼び出し元に渡すことができます。通常、ブレークポイントスクリプトが例外を生成すると、Venkman は設定ミスだろうと考えて例外を表示した後で停止します。例外が内部で投げられたときのコードの挙動を知りたい場合は、「例外を呼び出し元に渡す」にチェックしてブレークポイントスクリプトから例外を投げるのです。
- 結果を記録 チェックボックスにより、スクリプトの結果を対話セッションビューに出力させることができます。 結果に依らず続行 オプションと一緒に使用すると、ブレークポイントスクリプトを単なるログメッセージとして利用できます。
- ブレークポイントに出会った回数はブレークポイントスクリプトにパラメータとして渡されます。カウントをリセットするには「トリガカウント」フィールドに 0 を入力して下さい。
訳注:原文では予定ブレークポイントのプロパティについて書かれていましたが、実際のところ実ブレークポイントと予定ブレークポイント各々のプロパティを別のものとすることはできず、プロパティ設定の点では両者を区別できません。予定ブレークポイントに限った話だと誤解しないよう単に (実) ブレークポイントのプロパティについての記述にしました。
メタコメント
Venkman の「メタコメント」と呼ばれる機能を使うことで、デバッグしたいソースコード中に直接スクリプト付きブレークポイントを前もって埋め込んでおく事もできます。メタコメントというのは特別な形式のコメントのことで、後に続くコメント内のスクリプトを一定の方法で処理するようになっています。次のような種類のメタコメントを利用できます:
//@JSD_LOG
コメントは、それに続くスクリプトを停止するくとなく実行するように設定されたブレークポイントを挿入します。評価の結果は対話セッションに記録されます。//@JSD_BREAK
コメントは、それに続くスクリプトを実行して結果が真の場合は停止するように設定されたブレークポイントを挿入します。//@JSD_EVAL
コメントは、それに続くスクリプトを停止も結果の記録もすることなく実行するように設定されたブレークポイントを挿入します。- これらのメタコメントは、デバッグ用のみの製品コードにはまったく影響のないコードをスクリプトに挿入するために使用できます。
スクリプト中のメタコメントを有効にするには、読み込まれているスクリプトビューのファイルから「メタコメントをスキャン」コンテクストメニューを選択します。
メタコメントを追加すると、普通のブレークポイントが生成されます。このブレークポイントは手動で作成したブレークポイントとまったく同様に変更や削除できます。
情報源
- Venkman 入門: Venkman に関する前の記事
- MDC の Venkman ホームページ
原文書の情報
- 著者: Robert Ginda, Ian Oeschger
- 公開日: 02 May 2003