日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
本章では,デバッグ中にプログラムの実行を制御およびモニタする方法を説明します。
次の 2 つの関連機能については, 第 2 章 を参照してください。
第 3.4 節 では,デバッガがプログラムの実行を制御する方法について説明します。
本章には,すべてのプログラムに共通の情報が含まれています。詳細は以下の章を参照してください。
現在のデバッグ・セッションから,プログラムを再実行したり,別のプログラムを実行したりする方法については,
第 1.3.3 項 および 第 1.3.4 項 をそれぞれ参照してください。
プログラムの実行と直接関連しているデバッガ・コマンドは次の 4 つだけです。
第 2.3.1 項 と 第 2.3.2 項 で説明したように,GO コマンドと STEP コマンドは,プログラムの実行を開始または再開するための基本的なコマンドです。STEP コマンドについては, 第 3.2 節 で詳しく説明します。
デバッグ・セッション中は,ルーチンはプログラムの実行中に呼び出されて実行されます。CALL コマンドを使用すれば,プログラムにリンクされたルーチンを自由に呼び出して実行できます。CALL コマンドについては, 第 13.7 節 を参照してください。
EXIT コマンドについては,デバッグ・セッションの終了と関連して 第 1.8 節 で説明しました。EXIT コマンドはプログラム内の任意の終了ハンドラを実行するので,終了ハンドラのデバッグにも有効です (13.6 節を参照)。
これら 4 つのどのコマンドを使用する場合も,次のイベントの発生によってプログラムの実行が中断または停止することに注意してください。
STEP コマンド ( 最もよく使用されるデバッガ・コマンド ) を使用すれば,ユーザは,ステップ単位と呼ばれる小さい増分単位でプログラムを実行できます。
省略時の設定では,ステップ単位は実行可能なソース・コードの 1 行です。次の例では,STEP コマンドはソース・コードを 1 行実行し,動作を報告し ("stepped to..."),次の実行行の番号 (27) とソース・コードを表示しています。
3.1 プログラムを実行するコマンド
GO
STEP
CALL
EXIT (プログラムに終了ハンドラがある場合)
DBG> STEP stepped to TEST\COUNT\%LINE 27 27: X := X + 1; DBG> |
実行は,モジュール TEST 内の行 27 の最初の機械語コード命令で一時停止しています。27 行目は,モジュール TEST 内のルーチン COUNT 内に存在します。
STEP コマンドは,いくつかのソース行を一度に実行することもできます。パラメータとして正の整数を指定すると,STEP コマンドはその行数だけ実行します。次の例では,STEP コマンドは現在の位置から 3 行だけ実行します。
DBG> STEP 3 stepped to TEST\COUNT\%LINE 34 34: SWAP(X,Y); DBG> |
デバッガは,コンパイラがコード命令を生成したソース行だけを実行可能な行として認識することに注意してください。コメント行などの他の行はスキップされます。また,1 行内に 2 つ以上の文が含まれる場合,デバッガは,その行のすべての命令を 1 ステップとして実行します。
省略時の設定では,デバッグ中のモジュールのソース行が使用可能な場合には,ステップ実行後にソース行が表示されます。コンパイル時およびリンク時に,/DEBUG 修飾子を使用していないコード ( たとえば,共用可能イメージ・ルーチン ) 内の命令をステップ実行する場合,ソース行は使用できません。ソース行が使用可能な場合は, SET STEP [NO]SOURCE コマンドおよび STEP コマンドの /[NO]SOURCE 修飾子を使用して,その表示を制御できます。ソース・コードの表示方法の概略,特にステップ実行後の表示方法についての説明は, 第 6 章 を参照してください。
3.2.1 STEPコマンドの動作の変更
ユーザは,STEP コマンドの省略時の動作を次の 2 つの方法で変更できます。
次の例では,プログラム・カウンタ (PC) が CALL 文を指しているとき, STEP/INTO コマンドが,呼び出されたルーチン内の命令をステップ実行します。デバッガは,モジュール TEST 内のルーチン COUNT から呼び出されたルーチン PRODUCT のソース行を表示します。
DBG> STEP/INTO stepped to routine TEST\PRODUCT 6: function PRODUCT(X,Y : INTEGER) return INTEGER is DBG> |
STEP/INTO コマンドの実行後は,後続の STEP コマンドは省略時の動作に戻ります。
これとは対照的に,SET STEP を使用すると,STEP コマンドの新しい省略時の動作が設定されます。いったん設定された動作は,別の SET STEP コマンドが入力されるまで有効です。たとえば,SET STEP INTO コマンドによって,後続の STEP コマンドは STEP/INTO コマンドのように動作します。 SET STEP LINE コマンドであれば,後続の STEP コマンドは STEP/LINE コマンドのように動作します。
SET STEP コマンド・パラメータは STEP コマンドの各修飾子に対応しています。
STEP コマンドに,現在の省略時の動作とは異なる修飾子を指定することによって,その STEP コマンドの間だけ現在の省略時の動作を上書きすることができます。STEP コマンドの現在の省略時の動作を示すには,SHOW STEP コマンドを使用します。
省略時の設定では,PC が CALL 文を指しているときに STEP コマンドを入力すると,デバッガは呼び出されたルーチンを 1 ステップとして実行します。ルーチンは実行されますが,ルーチン内で実行が停止することはなく,CALL 文の次の行の先頭で実行が停止します。命令単位で実行している場合は,呼び出されたルーチンの復帰命令の直後の命令で実行が停止します。
PC が CALL 文を指しているときに呼び出されたルーチン内の命令をステップ実行するには,STEP/INTO コマンドを入力します。次の例は,TEST モジュールのルーチン COUNT から呼び出されたルーチン PRODUCT 内の命令をステップ実行する方法を示しています。
3.2.2 ルーチン内のステップ実行とルーチンの1ステップ実行
DBG> STEP stepped to TEST\COUNT\%LINE 18 18: AREA := PRODUCT(LENGTH, WIDTH); DBG> STEP/INTO stepped to routine TEST\PRODUCT 6: function PRODUCT(X,Y : INTEGER) return INTEGER is DBG> |
呼び出されたルーチン内の任意の位置から,呼び出し元のルーチンに復帰するには,STEP/RETURN コマンドを使用します。このコマンドによって,デバッガは実行中のルーチンの復帰命令をステップ実行します。後続の STEP コマンドによって,ルーチン呼び出しの直後の文に制御が戻ります。次に例を示します。
DBG> STEP/RETURN stepped on return from TEST\PRODUCT\%LINE 11 to TEST\PRODUCT\%LINE 15+4 15: end PRODUCT; DBG> STEP stepped to TEST\COUNT\%LINE 19 19: LENGTH := LENGTH + 1; DBG> |
いくつかのルーチン内の命令をステップ実行するには,SET STEP INTO コマンドを入力して STEP コマンドの省略時の動作を STEP/OVER から STEP/INTO に変更します。
DBG> SET STEP INTO |
このコマンドの入力後,PC が CALL 文を指しているときに STEP コマンドを入力すると,呼び出されたルーチン内で実行が中断するようになります。あとで,ルーチン呼び出しを 1 ステップとして実行したい場合には, SET STEP OVER コマンドを入力します。
SET STEP INTO が有効なときには,SET STEP コマンドに次のようなパラメータを指定することによって,デバッガがその中の命令をステップ実行する呼び出されるルーチンの種類を指定できます。
これらのパラメータを使用すれば,アプリケーションで定義されたルーチンの場合はその内部命令をステップ実行し,システム・ルーチンの場合は自動的に 1 ステップとして実行する,というような指定が可能になります。たとえば,次のコマンドは,呼び出されたルーチンがユーザ空間内に存在する場合だけ,その中の命令をステップ実行するようデバッガに指示します。システム空間内および共用可能イメージ内のルーチンは, 1 ステップとして実行されます。
DBG> SET STEP INTO,NOSYSTEM,NOSHARE |
SET BREAK[/qualifier[...]] [address-expression[, ...]] [WHEN (conditional-expression)] [DO (command[; ...])] |
次の例は,SET BREAK コマンドの典型的な使用例と,ブレークポイントでのデバッガの省略時の動作の概略を示しています。
この例では,SET BREAK コマンドは,ルーチン COUNT ( ルーチン・コードの先頭 ) にブレークポイントを設定します。そして,GO コマンドで実行を開始します。ルーチン COUNT に到達すると,実行は一時停止されます。デバッガは,ルーチン COUNT でブレークポイントに到達したことをユーザに知らせ ("break at ..."),実行を停止したソース行 (54) を表示し,コマンド入力を要求するプロンプトを表示します。
DBG> SET BREAK COUNT DBG> GO . . . break at routine PROG2\COUNT 54: procedure COUNT(X,Y:INTEGER); DBG> |
SET TRACE コマンドを使用すれば,プログラムの実行をトレースするプログラム記憶位置またはイベント ( トレースポイント ) を選択できます。ただし,トレースポイントでプログラムが一時停止することはありません。トレースポイントの設定後,ユーザは GO コマンドで実行を開始し,予期しない動作を調べながらその記憶位置をモニタできます。ルーチンにトレースポイントを設定すると,そのルーチンの呼び出し回数をモニタすることもできます。
トレースポイントでのデバッガの省略時の動作は,ブレークポイントの場合と同じです。ただし,トレースポイントではプログラムの実行は停止しません。したがって,トレースポイントに到達し,デバッガがそれを知らせるときに, DBG> プロンプトは表示されません。
SET TRACE コマンドの構文は,コマンド名以外は SET BREAK コマンドの構文と同じです。
SET TRACE[/qualifier[...]] [address-expression[, ...]] [WHEN (conditional-expression)] [DO (command[; ...])] |
SET TRACE コマンドと SET BREAK コマンドは,同じ修飾子を持っています。 SET TRACE コマンド使用時には,SET BREAK コマンドの場合と全く同じように,アドレス式,修飾子,およびオプションの WHEN 句や DO 句を指定します。
SET BREAK(SET TRACE) コマンドで /TEMPORARY 修飾子を使用しないかぎり,ブレークポイントおよびトレースポイントは,ユーザが次に示す動作を行うまで有効です。
現在設定されているすべてのブレークポイントおよびトレースポイントを示すには,SHOW BREAK (SHOW TRACE)コマンドを使用します。
ブレークポイントまたはトレースポイントを無効にする,有効にする,または取り消すには,次のコマンドを使用します ( 第 3.3.7 項 参照)。
DEACTIVATE BREAK, DEACTIVATE TRACE
ACTIVATE BREAK, ACTIVATE TRACE
CANCEL BREAK, CANCEL TRACE
次の各項では,SET TRACE コマンドと SET BREAK コマンドを使用してプログラム記憶位置およびイベントを指定する方法について説明します。
特定のプログラム記憶位置にブレークポイントまたはトレースポイントを設定するには,SET BREAK または SET TRACE コマンドをアドレス式といっしょに指定します。
基本的には,アドレス式はメモリ・アドレスまたはレジスタを指定します。デバッガはプログラムに対応するシンボルを理解します。したがって,ユーザが通常,SET BREAK または SET TRACE コマンドといっしょに使用するアドレス式は,メモリ・アドレスではなく,ルーチン名,ラベル,またはソース行番号です。デバッガは,これらのシンボルをアドレスに変換します。
次の例は,ルーチン (SWAP) にブレークポイント,ラベル (LOOP1) にトレースポイントを設定する方法を示しています。
3.3.1 個々のプログラム記憶位置へのブレークポイントまたはトレースポイントの設定
3.3.1.1 シンボリック・アドレスの指定
注意
SET BREAK コマンドまたは SET TRACE コマンドをシンボリック・アドレス式といっしょに使用する場合に,モジュールの設定,有効範囲またはパス名の指定が必要になることがあります。これらの概念については, 第 5 章 で詳しく説明します。以下の例では,特に指定しないかぎり,すべてのモジュールが設定され,参照されるすべてのシンボルが一意に定義されるものと想定します。
DBG> SET BREAK SWAP DBG> SET TRACE LOOP1 |
次のコマンドは,ルーチン SWAP の復帰命令上にブレークポイントを設定します。ルーチンの復帰命令上にブレークポイントを設定すると,そのルーチンがアクティブな状態の場合でも,ローカル環境を検査することができます ( たとえば,ローカル変数値の取得 )。
DBG> SET BREAK/RETURN SWAP |
いくつかの言語,たとえば Fortran では,数値ラベルを使用します。数値ラベル上にブレークポイントまたはトレースポイントを設定するには,数字の前に組み込みシンボルである %LABEL を付ける必要があります。 %LABEL を付けないと,デバッガは,数字をメモリ・アドレスと解釈してしまいます。たとえば,次のコマンドはラベル 20 にトレースポイントを設定します。
DBG> SET TRACE %LABEL 20 |
行番号の前に,組み込みシンボルである %LINE を付けると,ソース・コード行にブレークポイントまたはトレースポイントを設定することができます。次のコマンドは,14 行目にブレークポイントを設定します。
DBG> SET BREAK %LINE 14 |
上記のブレークポイントは,14 行目の最初の命令で実行を停止させます。ブレークポイントまたはトレースポイントを設定できるのは,コンパイラ生成命令に対応する行 ( 実行可能なコード行 ) だけです。コメント行または変数を宣言するだけで初期化しない文など命令と対応していない行の番号を指定すると,デバッガは診断メッセージを発行します。次に例を示します。
DBG> SET BREAK %LINE 6 %DEBUG-I-LINEINFO, no line 6, previous line is 5, next line is 8 %DEBUG-E-NOSYMBOL, symbol '%LINE 6' is not in the symbol table DBG> |
上記のメッセージは,コンパイラが 6 行目と7行目に対応する命令を生成しなかったことを示します。
いくつかの言語では,1 行に 2 つ以上の文を書くことができます。このような場合,同一行上の文を識別するために文番号を使用できます。文番号は,行番号の後ろにピリオド (.) とその文を示す番号を付けたものです。形式は次のとおりです。
%LINE line-number.statement-number |
たとえば,次のコマンドは38行目の2番目の文にトレースポイントを設定します。
DBG> SET TRACE %LINE 38.2 |
コマンド内で参照されているシンボルを検索するときに,デバッガは 第 5.3.1 項 で説明する規則を使用します。すなわち,現在実行が停止しているモジュール内を最初に検索し,その後,呼び出しスタック内のルーチンに対応する他の有効範囲を検索します。したがって,行番号など,2 つ以上のモジュールで定義されているシンボルを指定するには,パス名を使用する必要があります。たとえば,次のコマンドは,モジュール MOD4 の 27 行目にトレースポイントを設定します。
DBG> SET TRACE MOD4\%LINE 27 |
デバッガ・コマンド内で行番号を指定するときには,シンボル検索規則に注意する必要があります。実行が停止しているモジュール内で行番号が定義されていない場合,その行に対応する命令が存在しないため,デバッガはシンボル検索規則に従って,行番号が定義されている他のモジュール内を検索します。
アドレス式を指定する場合,シンボリック・アドレスとバイト・オフセットを組み合わせることができます。したがって,行番号とその行の先頭から命令の先頭バイトまでのオフセットを指定することによって,特定の命令にブレークポイントまたはトレースポイントを設定できます。たとえば,次のコマンドは,23 行目の先頭から 5 バイトの位置のアドレスにブレークポイントを設定します。
DBG> SET BREAK %LINE 23+5 |
目次 | 索引 |
|