前へ | 次へ | 目次 | 索引 |
省略時の設定では,PC が CALL 文を指しているときに STEP コマンドを入力すると,デバッガは呼び出されたルーチンを 1 ステップとして実行します。ルーチンは実行されますが,ルーチン内で実行が停止することはなく,CALL 文の次の行の先頭で実行が停止します。命令単位で実行している場合は,呼び出されたルーチンの復帰命令の直後の命令で実行が停止します。
PC が CALL 文を指しているときに呼び出されたルーチン内の命令をステップ実行するには,STEP/INTO コマンドを入力します。次の例は,TEST モジュールのルーチン COUNT から呼び出されたルーチン PRODUCT 内の命令をステップ実行する方法を示しています。
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 |
3.3 ブレークポイントによる実行の中断とトレースポイントによるトレース
この節では,SET BREAK コマンドと SET TRACE コマンドを使用して,プログラムの実行をそれぞれ中断およびトレースする方法について説明します。この 2 つのコマンドは類似点が多いため,いっしょに説明します。
SET BREAK コマンドを使用すれば,プログラムの実行を中断するプログラム記憶位置またはイベント(ブレークポイント)を指定できます。ブレークポイントの設定後,ユーザは,GO コマンドを使用してプログラムの実行を開始または再開できます。プログラムは,指定された記憶位置に到達するか,または指定された条件が満たされるまで,実行を続けます。ブレークポイントが検出されると,デバッガは実行を中断し,ブレークポイントを示して,DBG> プロンプトを表示します。ユーザは,ここでたとえば,SHOW CALLS コマンドで現在の位置を決定する,ルーチン内の命令をステップ実行する,変数を検査または変更する,といったデバッガ・コマンドを入力できます。
SET BREAK コマンドの構文は次のとおりです。
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 コマンドを使用してプログラム記憶位置およびイベントを指定する方法について説明します。
3.3.1 個々のプログラム記憶位置へのブレークポイントまたはトレースポイントの設定
特定のプログラム記憶位置にブレークポイントまたはトレースポイントを設定するには,SET BREAK または SET TRACE コマンドをアドレス式といっしょに指定します。
基本的には,アドレス式はメモリ・アドレスまたはレジスタを指定します。デバッガはプログラムに対応するシンボルを理解します。したがって,ユーザが通常,SET BREAK または SET TRACE コマンドといっしょに使用するアドレス式は,メモリ・アドレスではなく,ルーチン名,ラベル,またはソース行番号です。デバッガは,これらのシンボルをアドレスに変換します。
3.3.1.1 シンボリック・アドレスの指定
SET BREAK コマンドまたは SET TRACE コマンドをシンボリック・アドレス式といっしょに使用する場合に,モジュールの設定,有効範囲またはパス名の指定が必要になることがあります。これらの概念については,第 5 章 で詳しく説明します。以下の例では,特に指定しないかぎり,すべてのモジュールが設定され,参照されるすべてのシンボルが一意に定義されるものと想定します。 |
次の例は,ルーチン(SWAP)にブレークポイント,ラベル(LOOP1)にトレースポイントを設定する方法を示しています。
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 |
メモリ内の記憶位置にブレークポイントまたはトレースポイントを設定するには,現在設定されている基数による数値アドレスを指定します。ほとんどの言語では,データの入力時と表示用の省略時の基数は,10 進数です。
VAX プロセッサでは,例外は,BLISS と MACRO-32 です。これらの省略時の基数は,16 進数です。
Alpha プロセッサでは,例外は,BLISS,MACRO-32,MACRO-64 です。これらの省略時の基数は,16 進数です。
たとえば,次のコマンドは,10 進数で 2753 のアドレスまたは 16 進数で 2753 のアドレスに,ブレークポイントを設定します。
DBG> SET BREAK 2753 |
組み込みシンボル %BIN,%OCT,%DEC,%HEX のいずれかを使用すると,ユーザは 2753 などの個々の整数リテラルの入力時に基数を指定できます。たとえば次のコマンド行では,2753 が 16 進数の整数として処理されなければならないことをシンボル %HEX が指定しています。
DBG> SET BREAK %HEX 2753 |
数字ではなく文字で始まる 16 進数を指定するときには,最初に 0 を付ける必要があることに注意してください。そうしないと,デバッガは,指定された要素をプログラム内のシンボルと解釈しようとします。
基数の指定および組み込みシンボル %BIN,%DEC,%HEX,%OCT についての詳しい説明は,第 4.1.10 項 と 付録 B を参照してください。
ブレークポイントまたはトレースポイントがプログラム内のシンボルに対応する数値アドレスに設定されている場合は,SHOW BREAK コマンドまたは SHOW TRACE コマンドによって,ブレークポイントをシンボリックに示すことができます。
3.3.1.3 メモリ・アドレスの取得とシンボル化
行番号,ルーチン名,ラベルなどのシンボリック・アドレス式に対応するメモリ・アドレスを決定するには EVALUATE/ADDRESS コマンドを使用します。次に例を示します。
DBG> EVALUATE/ADDRESS SWAP 1536 DBG> EVALUATE/ADDRESS %LINE 26 1629 DBG> |
アドレスは,現在の基数で表示されます。基数修飾子を指定して,別の基数でアドレスを表示することもできます。次に例を示します。
DBG> EVALUATE/ADDRESS/HEX %LINE 26 0000065D DBG> |
SYMBOLIZE コマンドは,EVALUATE/ADDRESS と逆の動作をします。つまり,対応するシンボルが存在する場合に,メモリ・アドレスをパス名を含むシンボル表現に変換します。第 5 章 でシンボル化の制御方法について説明します。アドレスの取得とシンボル化についての詳しい説明は,第 4.1.11 項 を参照してください。
3.3.2 行または命令へのブレークポイントまたはトレースポイントの設定
次の SET BREAK または SET TRACE コマンド修飾子を使用すれば,特定のクラス内のすべてのソース行またはすべての命令でブレークまたはトレースするように設定できます。
/LINE
/BRANCH
/CALL
/INSTRUCTION
/INSTRUCTION=(opcode[,...])(VAX のみ)
/VECTOR_INSTRUCTION(VAX のみ)
これらの修飾子を使用する場合,アドレス式を指定してはなりません。
たとえば,次のコマンドは実行中に検出されたすべてのソース行の先頭でブレークするように設定します。
DBG> SET BREAK/LINE |
命令関連の修飾子は,特に命令コードのトレースに有効です。すなわち,すべての命令をトレースする場合や特定のクラスの命令をトレースする場合に有効です。次のコマンドは,検出されたすべての分岐命令(たとえば,BEQL,BGTR など)をトレースするように設定します。
DBG> SET TRACE/BRANCH |
命令コード・トレースは,プログラムの実行速度を低下させることに注意してください。
省略時の設定では,ここで説明した修飾子を使用した場合,デバッガは現在実行しているルーチン内だけでなく,すべての呼び出されたルーチン内でもブレークまたはトレースします。これは,SET BREAK/INTO または SET TRACE/INTO を指定した場合と同じです。SET BREAK/OVER または SET TRACE/OVER を指定すれば,すべての呼び出されたルーチン内でのブレーク動作またはトレース動作を抑止できます。あるいは,/[NO]JSB,/[NO]SHARE,/[NO]SYSTEM の各修飾子を使用して,ブレーク(トレース)動作を抑止するルーチンの種類を指定することもできます。たとえば,次のコマンドは,呼び出されたルーチンが共用可能イメージかシステム空間内に存在する場合を除き,呼び出されたルーチン内のすべての命令でブレークするように設定します。
DBG> SET BREAK/LINE/NOSHARE/NOSYSTEM |
前へ | 次へ | 目次 | 索引 |