アプレットのデバッグ

概要

Curl® 総合開発環境 (IDE) には、作成した Web アプリケーションのエラーを検出して修正するためのデバッグ ツールが用意されています。
アプレットがランタイム エラーを検出すると、IDE はデバッグ レイアウトに切り替わります。「IDE レイアウト」を参照してください。アプレットがデバッガで停止した場合、[デバッグ] メニューのコマンドか IDE ツールバーの適切なボタンを選択して、コードの実行を制御できます。または、IDE でブレイクポイントを設定することで、アプレットを停止させてデバッグすることもできます。詳細は「ブレイクポイント ペイン」を参照してください。あるいは、アプレットが特定の例外をスローするとデバッガでアプレットが停止するように指定することもできます。詳細は「例外ペイン」を参照してください。
Curl IDE にはエラーを含むサンプル アプレットが 2 つ用意されていて、これらを使って IDE デバッガの機能を確認することができます。これらのサンプルは d:\automated-build-temp\build\win32-atom\docs\default\examples\uguide\debugger.zip にあります。このアーカイブから適切なディレクトリにファイルを解凍してから、IDE で開いて実行します。アーカイブには次の 2 つのファイルが含まれています。
以下のセクションではこれらの 2 つのサンプル アプレットを使って説明しています。

デバッグ用の IDE ペイン

アプレットをデバッグする際には、複数の IDE ペインで作業する必要があります。

コールスタック ペイン

このペインには、アプレットの実行が停止された時点のコールスタックが表示されます。ペインの上には [アプレット] というラベルを持つドロップダウン リストがあり、デバッガで停止したすべてのアプレットが一覧表示されます。このドロップダウン リストで選択されているアプレットは IDE で現在デバッグ中のアプレットで、IDE で表示されているすべてのデバッグ情報はこのアプレットに関連しています。
アプレット選択用のドロップダウン リストのすぐ下には、アプレットのステータスを簡単に説明するフィールドがあり、その下にはコールスタックを表示する領域があります。コールスタックの特定のポイントを調べるには、この領域で該当する行をダブルクリックします。
[エディタ] ペインには [コールスタック] ペインで選択されているアプレットのソース コードが表示され、選択されたコールスタックのポイントに対応するコード行がハイライト表示されます。
例えば、IDE でアプレット divide-by-zero.curl を実行するとします。ArithmeticException のスローが原因でアプレットが停止すると、[コールスタック] ペインには 2 つの項目が現れます。これらの項目の選択を変更すると、選択されたスタック フレームのローカル変数が表示され、ソース コードでは該当する行がハイライト表示されます。
次の図は、divide-by-zero.curl が最初にデバッガで停止したときの状態を示しています。
Figure: デバッガで停止した divide-by-zero.curl
次の図は、前のスタック フレームを選択したときのデバッガの状態を示しています。[ローカル][エディタ] ぺインの変化に注意してください。
Figure: 前のスタック フレームの表示
次に、アプレット buffer-overrun.curl を開いて実行してみます。これにより、IDE で両方のアプレットをデバッグすることになります。[コールスタック] ペインのドロップダウン リストで、まず最初のアプレットを選択し、次に 2 番目のアプレットを選択してください。[エディタ] ペインの画面が選択されたアプレットのソース ファイルに切り替わります。
次の図は、IDE でこれら 2 つのアプレットのデバッグを行っている様子を示しています。
Figure: 2 つのアプレットのデバッグ

ローカル ペイン

このペインには、[コールスタック] ペインで選択された実行ポイントのローカル変数やその値が表示されます。デバッガで作業を続けると (例えばアプレットを段階的に実行するなど)、変更したばかりの値は赤色で表示されます。
ツリー表示のコントロールを使い、オブジェクトを展開してその中の要素を確認できます。次の図は、[ローカル] ペインで配列の内容を表示しています。
Figure: 配列の内容を示す [ローカル] ペイン

式ペイン

[式] ペインでは、現在アクティブなローカル変数を含む Curl 言語式を入力して評価することができます。次の図は [式] ペインで 2 つの式が評価されている様子を示しています。ここでは、利用可能なアプレットの変数は [コールスタック] ペインの選択項目によって決定され、これに [ローカル] ペインに表示されている変数とすべてのグローバル変数が追加されることに注意してください。
Figure: デバッガ内で式を評価
[式] ペインでは、{OBJ address} という特別なプロシージャを使ってオブジェクトやそのプロパティにアクセスすることができます。OBJ プロシージャは 1 つの引数を取り、これはオブジェクトのアドレスになります。このプロシージャは [式] ペインのみで使用でき、他のコンテキストでは使用できません。
次の図は OBJ が使われている様子を示しています。OBJ の引数が、[ローカル] ペインに表示されている Array-of any のアドレスである点に注意してください。この例では「.property」の構文を使って配列のサイズにアクセスしています。ここでは OBJ の使い方を簡単な例で示しているだけで、同じ情報は [式] ペインに a.size と入力して得ることもできます。ただし、変数名を使ってオブジェクトに直接アクセスできない場合があり、このような場合に OBJ は大変役に立ちます。
Figure: OBJ の使用
アプレットがブレイクポイントで停止している間に変数または選択された式の上にカーソルを置いておくと、IDE がツールチップとして変数または式の値を表示します。IDE は有効な値が得られるときだけ、値を表示します。エラーが発生し値が得られない場合は、IDE は何も表示しません。
これらのツールチップは式の評価が有効なコンテキスト内でのみ生成されます。たとえば、現在停止しているアプレットのスタック上にあるメソッドのソースの範囲内で式を検証することができます。コールスタック ペインで表示されているアプレットを変更することにより、同時にデバッガ内で停止しているアプレットを切り替えることができます。
[ローカル][式] ペインでは重要なコンテキスト メニューを提供しています。

ブレイクポイント ペイン

ブレイクポイント ペインは、IDE エディタで開いているすべてのファイルで設定されているブレイク ポイントを一覧表示します。ブレイク ポイントが設定されている行にアプレットが達すると実行が停止され、IDE は デバッグ レイアウトに切り替わります。ここで、「デバッグ メニュー」のデバッグ コマンドを使ってアプレットの実行を制御できます。これらのコマンドのサブセットはツールバー上のボタンとして使用可能です。「IDE ツール バー」を参照してください。
ブレイクポイントは [デバッグ] メニューの [ブレイクポイントの設定] コマンドで設定できます。このコマンドはカーソルがある行にブレイクポイントを追加します。既にブレイクポイントのある行にカーソルがある場合は、コマンド ラベルが [ブレイクポイントを取り除く] となり、これを選択するとブレイクポイントが取り除かれます。[エディタ] ペインの左端にあるグレーのボーダーの赤い点は隣接する行のブレイクポイントを示します。ブレイクポイントはグレーのボーダーをクリックすることによって設定し、赤い点の上でクリックすることによって解除することができます。
[デバッグ] メニューの [ブレイクポイントを消去] コマンドでブレイクポイントを無効にすることができます。このコマンドはカーソルがある行のブレイクポイントを無効にします。赤い円はブレイクポイントが無効にされたことを示しています。カーソルが無効にされたブレイクポイントのある行にある場合は、コマンド ラベルは [ブレイクポイントを有効にする] となり、これを選択するとブレイクポイントが有効になります。
また、ブレイクポイント ペインでもブレイクポイントを有効にしたり無効にしたりすることができます。このペインは各ブレイクポイントのファイル名と行数を一覧表示します。ブレイクポイントの一覧内の各ブレイクポイントの左側にあるチェックボックスはブレイクポイントが有効であるかどうかを制御します。アプレットをデバッグしている際、有効なブレイクポイントでのみ実行が停止します。}
次の図は、2つのブレイクポイントを示しています。1つは4行目の無効なブレイクポイント、もう1つは12行目の有効なブレイクポイントです。
Figure: 無効、および有効なブレイクポイント
また、ブレイクポイント ペインでは、以下のコマンド ボタンが提供されています。

条件付きブレイクポイント

各ブレイクポイントの一覧の右側には、テキストフィールドがあります。このフィールドを使用して、IDE がデバッグの実行を停止する条件を定義する式を入力することができます。小さい四角形を囲む円は条件付きブレイクポイントを示しています。次の図は、条件が適用された2つのブレイクポイントを示しています。実行は背景色が変わっている行で停止し、x の値を式ペインにコピーするのに、コンテキスト メニュー コマンド [名前を式にコピー] が使用されています。x の値が -3 で、これはこのブレイクポイントの条件である x > -4 を満たしていることがわかります。
Figure: 条件付きブレイクポイントの使用
このポイントからの実行を続行すると、次の図で示されるような状況になります。実行は示された行で停止します。
Figure: 条件付きブレイクポイントの続行
この時点で、ブレイクポイントをスキップして続行したい場合は、チェックボックスをクリックして、ブレイクポイントを無効にすることができます。小さい点を囲む赤い円は、無効な条件付きブレイクポイントを示しています。次の図で結果を示しています。実行は、引き続き有効なブレイクポイントで停止し、i の値は式ペインにコピーされています。i の値は 0 で、これは条件付きブレイクポイントを満たしています。13行目で指定した条件はまだそこにあって、ブレイクポイントを有効にすると実施されます。
Figure: 条件付ブレイクポイントの無効化

値の表示

アプレットがブレイクポイントで停止したとき、[エディタ] ペインのオブジェクト上にカーソルを置くことで変数と式の値を見ることができます。値はツールチップとして表示されます。有効な値が得られるときだけ値を見ることができます。エラーが発生した場合は、値を見ることができません。
値が見られるのは式の評価に有効なコンテキスト内だけです。[コールスタック] ペインで示されているように、値は現在停止しているアプレットのスタックのメソッドのソースの範囲内にあるものに限られます。[コールスタック] ペインで選択すると停止している異なるアプレットから値を見ることができます。
右クリックのコンテキスト メニューには [名前を式にコピー]というアイテムがあり、これで名前の付けられた変数を式ペインにコピーし、そこでさらに詳しく調べることができます。

指定された行まで実行

アプレットがデバッガ内で停止したときカーソルが現在置かれている場所までアプリケーションの実行を継続することができます。カーソルの位置は一時的に一度限りのブレイクポイントの役割を果たします。[指定された行まで実行] アイテムは [デバッグ] メニュー、あるいは [エディタ] ペインの右クリック コンテキスト メニューから選択できます。次の図はコンテキスト メニューからの [指定された行まで実行] の選択を示しています。
Figure: 指定された行まで実行 のコンテキスト メニュー
[指定された行まで実行] を実行する際に便利なショートカットを使うことができます。実行を停止したい行の左側にある灰色の境界線上にカーソルを置き、shift+左クリック をタイプしてください。[指定された行まで実行] が選択した行で有効になっていない場合は、どのコードも実行されません。
次の図で示されているように、白い背景上のオレンジ色の点を使用して一時的なブレイクポイントを表示します。
Figure: 指定された行まで実行
一時的なブレイクポイントの印は実行がその行に達するまで表示され続けます。アプレットの実行が選択された行に達したとき、その印は消え、色のついた背景がアプレットが現在デバッガ内で停止している行を表示します。
Figure: 指定された行で停止した実行

例外ペイン

このペインでは、特定の例外がスローされてアプレットの実行が停止した場合に、これらの例外がブレイクポイントとして動作するように指定できます。これは、コードで例外を処理する場合や例外がスローされる状況を調べたいときに特に便利です。このタブのメイン領域には、現在アクティブな例外ブレイクポイントが一覧表示されます。
ペイン上部のコンボボックスに例外の名前を入力し、[Enter] キーを押してリストに追加します。リストに例外を追加するとコンボボックスにも追加されるので、同じ例外を再度選択して簡単に追加できます。リスト領域で右クリック メニューを使い、すべての例外ブレイクポイントまたは選択した項目のみ解除することができます。
例えば、アプレット buffer-overrun.curl をロードして実行してみます。このアプレットは MyException を使って、ゼロによる除算が起きた場合にこれを処理します。[例外] ペインの [例外] フィールドに MyException と入力し、アプレットを再度実行してください。デバッガではアプレットがこの例外をスローする位置で実行を停止します。

デバッグ可能なアプレット

アプレットでランタイム エラーが発生したときの Curl 実行環境 (RTE) の動作は、アプレットがデバッグ可能かどうかによって異なります。IDE から開始するアプレットはすべてデバッグ可能です。さらに、Curl RTE ではデバッグする場所のリストを管理していて、これらの場所からロードされるアプレットはすべてデバッグ可能になります。デバッグする場所は、Curl ® コントロール パネルの [デバッグ] で指定します。デバッグ可能なアプレットは、デバッグしないアプレットよりわずかに実行速度が遅くなります。
デバッグ可能なアプレットでエラーが発生すると、RTE は IDE を前面に表示します。IDE には、エラーが発生したソース ファイル行、コールスタック、およびエラーの説明が表示されます。アプレットがデバッグ可能でない場合はエラーのスローを警告するダイアログが表示され、そこでアプレットの続行または停止を選択します。
Curl アプレットマネージャから IDE のデバッガを起動することもできます。 アプレットマネージャではアプレットを終了または消去することもできます。 アプレットマネージャは、Curl コントロールパネルの [アプレットの表示]をクリックして開始します。