ソースコードエリアには、トレースされているメソッドのソースコードが表示されます。
メソッドが長すぎてテキストエリアに収まらない場合には、スクロールするとメソッドの他の部分も表示できます。
評価できる式(フィールド、変数、ポインター、配列等)にマウスポインタを移動すると、ツールチップが表示され、オブジェクトや式の現在の値とその宣言型が示されます。
次の図はソースコードエリアを示しています:
![](../../picture/21157/pict21157.ja.png)
ツールチップが表示されているのは、マウスポインターが変数pTableの上に置かれているためで、その表示によると、この変数は[Customers]テーブルへのポインターです。
ソースコードエリア内でテキストの部分を選択できます。この場合、選択されたテキストの上にカーソルを移動すると、選択されたオブジェクトの値をTipsとして表示します:
![](../../picture/21158/pict21158.ja.png)
変数名またはフィールドをクリックすると自動的に選択されます。
Tip: ソースコードエリアで選択した式(評価できる)をカスタムウォッチエリアにコピーすることが出来ます。次の方法のいずれかでコピーすることが出来ます:
- 単純にドラッグ&ドロップを行なう(選択したテキストを評価エリア内へドラッグ&ドロップする)
- WindowsではCtrl+D、Macintoshではcommand+Dのキーのコンビネーション。
ソースコードエリアの左マージンにある黄色の矢印(上図を参照してください)は、実行される次の行を表しています。この矢印は、プログラムカウンターと呼ばれます。プログラムカウンターは、常に実行寸前の行を表示します。
デバッグのために、メソッド連鎖のトップにあるメソッド(現在実行されているメソッド)のプログラムカウンターの位置を変更できます。そのためには、黄色の矢印をクリックして目的の行まで上下にドラッグします。
警告: この機能は、十分注意して使用してください。
プログラムカウンターを順方向に移動しても、スキップした行をデバッガーがすばやく実行されるわけではありません。同様に、プログラムカウンターを逆方向に移動しても、既に実行された行の結果をデバッガーが逆方向に実行されるわけではありません。
プログラムカウンターを移動するということは、デバッガーにその位置からのトレースや実行を追跡するように指示するというだけに過ぎません。すべての現在の設定内容、フィールド、変数等には、プログラムカウンターの移動による影響はありません。
プログラムカウンターを移動する例は、次の通りです。例えば、次のようなコードをデバッグすると仮定します:
If(This condition)
Else
End if
プログラムカウンターは、行If (This condition)に設定されています。1ステップ先に進むと、プログラムカウンターが行DO SOMETHING ELSEに移動していることがわかります。別の分岐にある行を実行しようとしていたため、これは思いがけないことです。この場合には、This conditionという式が次のステップに影響を与えるような演算を実行していなければ、プログラムカウンタを行DO SOMETHINGに戻します。これで、コードの当初目的としていた部分を続けてトレースすることができます。
デバッグの過程において、コードのトレースを一部スキップすることが必要な場合があります。デバッガでは、特定の位置までコードを実行する方法がいくつか提供されます:
- ステップごとの処理中に、ステップ(呼び出しメソッドもトレース)ボタンではなくステップ(同一メソッドのみ)ボタンをクリックすることができます。プログラムカウンタ行で呼び出されているサブルーチンや関数の実行を避けたい場合には、この方法が役立ちます。
- 間違ってサブルーチンの処理を始めてしまった場合には、ステップアウト(呼び出し元へ戻る)ボタンをクリックすると、そのサブルーチンを実行した後直接、呼び出し元のメソッドに戻ることができます。
- TRACEコマンド呼び出しをある位置で指定した場合には、トレースなしボタンをクリックすると、そのTRACEコマンド呼び出しまでの実行を再開始することができます。
次に、プログラムカウンタを行ALL RECORDS([This Table])に設定し、次のようなコードを実行していると想定してみます:
ここでの目的は、Forループが終了した後で$vrResultの値を評価することです。コードがこの位置まで実行されるにはかなりの処理時間がかかるため、現在の実行をアボートしたくない場合には、TRACEコマンド呼び出しを行If($vrResult..の前に挿入するようにメソッドを編集する必要があります。
ループのステップ処理を実行することも1つの方法ですが、[ThisTable]テーブルに何百件ものレコードが入っている場合には、この処理にかなりの時間を費やすことになります。このような状況では、デバッガのブレークポイントを使用できます。ブレークポイントは、ソースコードエリアの左マージンをクリックすると挿入できます。
例題:
次の例では、行If($vrResult...のレベルでソースコードエリアの左マージンをクリックします:
![](http://doc.tmp.4d.fr/picture/21159/pict21159.ja.png)
このようにすると、その行にブレークポイントが挿入されます。ブレークポイントは赤色の点で表されます。次に、トレースなしボタンをクリックします。
このようにすると、ブレークポイントで示された行まで、通常の実行が再開されます。ブレークポイントで示された行は実行されずに、トレースモードへ 戻ります。この例では、ループ全体は連続して正常に実行されています。そのため、ブレークポイントに到達した時には、マウスボタンを$vrResultの上に移動して、その値をループの終了地点で評価する必要があります。
プログラムカウンタより下方(後に実行される)の行にブレークポイントを設定し、トレースなしボタンをクリックすると、ブレークポイントまでのメソッドをスキップすることができます。
Note: メソッドエディタで直接ブレークポイントを設定することが出来ます。詳しくはブレークポイントを参照してください。
ブレークポイントを追加すると、それはメソッドに保存されます。データベースを再起動してもそこにあります。
永続的ブレークポイントを取り除く方法は、次の2通りです:
- 永続的ブレークポイントを使用した後、赤色の点をクリックすると、ブレークポイントは消えます。
- 永続的ブレークポイントをまだ使用する場合には、これを残しておきたい場合もあります。永続的ブレークポイントを編集すると、一時的に使用不可能にすることができます。編集方法については、ブレークポイントで説明しています。
ソースコードエリア のコンテキストメニューを使用して、トレースモードでメソッドを実行する際に便利な機能にアクセスできます:
![](../../picture/863301/pict863301.en.png)
- 定義に移動: 選択されたオブジェクトの定義に移動する。このコマンドは以下のオブジェクトに使用できます:
- プロジェクトメソッド: 新しいメソッドエディターウィンドウにメソッドの内容を表示
- フィールド: ストラクチャーウィンドウのインスペクターにフィールドプロパティを表示
- テーブル: ストラクチャーウィンドウのインスペクターにテーブルプロパティを表示
- フォーム: フォームエディターにフォームを表示
- 変数 (ローカル, プロセス, インタープロセス, $n引数): カレントメソッド内で宣言行を表示する、または変数が宣言されたコンパイラーメソッドを表示する
- 参照を検索 (メソッドエディターでも利用可能): メソッド現在の要素が参照されているすべてのデータベースオブジェクト (メソッドとフォーム) を検索。現在の要素とは選択されているものまたはカーソルが存在するものをいいます。これにはフィールド、変数、コマンド、文字列等が含まれます。検索結果は検索結果ウィンドウに表示されます。
- ここまで実行: プログラムカウンター (黄色の矢印) とメソッド中で選択された行までの間のコードを実行する。
- 次の行までジャンプ: 現在の行および途中の行を実行せずに、プログラムカウンターを選択された行まで移動する。選択された行は、ユーザーが実行ボタンのいずれかをクリックした際に実行されます。
- ブレークポイント切り替え (メソッドエディターでも利用可能): 選択された行のブレークポイントの有無を切り替えます。これによりメソッドエディターのブレークポイントの有無も切り替わります。
- ブレークポイント編集 (メソッドエディターでも利用可能): ブレークポイントプロパティダイアログボックスを表示します。ここで行われた変更はメソッドエディターにも反映されます。