[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

3 プログラム実行の制御とモニタ

本章では,デバッグ中にプログラムの実行を制御およびモニタする方法を説明します。

次の2つの関連機能については,第2章を参照してください。

第3.4節では,デバッガがプログラムの実行を制御する方法について説明します。

本章には,すべてのプログラムに共通の情報が含まれています。詳細は以下の章を参照してください。

現在のデバッギング・セッションから,プログラムを再実行したり,別のプログラムを実行したりする方法については, 第1.3.3 項および第1.3.4項をそれぞれ参照してください。

3.1 プログラムを実行するコマンド

プログラムの実行と直接関連しているデバッガ・コマンドは次の4つだけです。


GO
STEP
CALL
EXIT (プログラムに終了ハンドラがある場合)

第2.3.1項第2.3.2項で説明したように,GO コマンドとSTEPコマンドは,プログラムの実行を開始または再開するための基本的なコマンドです。STEP コマンドについては, 第3.2節で詳しく説明します。

デバッギング・セッション中は,ルーチンはプログラムの実行中に呼び出されて実行されます。CALL コマンドを使用すれば,プログラムにリンクされたルーチンを自由に呼び出して実行できます。CALL コマンドについては, 第13.7節を参照してください。

EXITコマンドについては,デバッギング・セッションの終了と関連して第1.8節で説明しました。EXIT コマンドはプログラム内の任意の終了ハンドラを実行するので, 終了ハンドラのデバッグにも有効です(13.6 章を参照)。

これら4つのどのコマンドを使用する場合も,次のイベントの発生によってプログラムの実行が中断または停止することに注意してください。

3.2 ステップ単位でのプログラムの実行

STEPコマンド(最もよく使用されるデバッガ・コマンド)を使用すれば,ユーザは, ステップ単位と呼ばれる小さい増分単位でプログラムを実行できます。

省略時の設定では,ステップ単位は実行可能なソース・コードの1行です。 次の例では,STEPコマンドはソース・コードを1行実行し,動作を報告し("stepped to . . . ") ,次の実行行の番号(2 7)とソース・コードを表示しています。

     DBG> STEP
     stepped to TEST\COUNT\%LINE 27
          27:   X := X + 1;
     DBG>

実行は,モジュールTEST内の行27の最初の機械語コード命令で一時停止しています。27 行目は,モジュールTEST内のルーチンCOUNT内に存在します。

STEPコマンドは,いくつかのソース行を1度に実行することもできます。 パラメータとして正の整数を指定すると,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/IN TOコマンドが,呼び出されたルーチン内の命令をステップ実行します。 デバッガは,モジュール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 コマンドを使用します。

3.2.2 ルーチン内のステップ実行とルーチンの1 ステップ実行

省略時の設定では,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コマンドの概要

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コマンドの概要

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

3.3.1.2 メモリ内の記憶位置の指定

メモリ内の記憶位置にブレークポイントまたはトレースポイントを設定するには, 現在設定されている基数による数値アドレスを指定します。ほとんどの言語では, データの入力時と表示用の省略時の基数は,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

3.3.3 エミュレートされた命令へのブレークポイントの設定(Alpha のみ)

Alphaシステムで,命令がエミュレートされているときに,デバッガがプログラムの実行を中断するように設定するには,SET BREAK/SYSEMULATE コマンドを使用します。/SYSEMULATE 修飾子を使用する場合のSET BREAKコマンドの構文は次のとおりです。

     SET BREAK/SYSEMULATE[=mask]

maskは省略可能な引数であり,どの命令グループがブレークポイントを起動するかを指定するためのビットがセットされたクォドワードです。 現在定義されているエミュレートされた命令グループはBYTE 命令とWORD命令だけです。 この命令グループは,maskのビット0を1にセットすることにより指定します。

maskを指定しなかった場合や,mask = FFFFFFFFFFFFFFFFの場合には,オペレーティング・ システムが命令をエミュレートしたときに,デバッガはプログラムの実行を停止します。

3.3.4 ブレークポイントまたはトレースポイントでのデバッガ動作制御

SET BREAKコマンドおよびSET TRACEコマンドには,ブレークポイントおよびトレースポイントでのデバッガの動作を制御するためのオプションがいくつかあります。 すなわち,/AFTER,/[NO]SILENT,/[NO]SOURC E,/TEMPORARYの各コマンド修飾子とオプションのWHEN句とDO句です。次に, これらのオプションの使用例をいくつか示します。

次のコマンドは,14行目にブレークポイントを設定し,14行目が5回実行されたあとに, そのブレークポイントが有効になるよう指定します。

     DBG> SET BREAK/AFTER:5 %LINE 14

次のコマンドは,実行されるすべての行でトレースポイントが検出されるよう設定します。DO 句は,各行が実行されるたびに変数Xの値を取得します。

     DBG> SET TRACE/LINE DO (EXAMINE X)

次の例は,WHEN句とDO句をいっしょに取り込む方法を示したものです。このコマンドは,27 行目にブレークポイントを設定します。ブレークポイントが検出される( 実行が停止する)のは,SUMの値が100より大きいときだけです。27 行目が実行されるたびにブレークするわけではありません。DO句は, ブレークポイントが検出されるたびに,すなわちSUMの値が100より大きいときは必ず,TEST_RESULT の値を調べます。実行が27行目に到達したときに,SUM の値が100以下の場合は,ブレークポイントは検出されず,DO 句も実行されません。

     DBG> SET BREAK %LINE 27 WHEN (SUM > 100) DO (EXAMINE TEST_RESULT)

式"SUM> 100"などの言語式の評価についての説明は,第4.1.6項第14.3.2.2項を参照してください。

/SILENT修飾子は,ブレークまたはトレースのメッセージとソース・コードの表示を抑止します。 この修飾子は,トレースポイントでのデバッガ・ コマンドの実行だけにSET TRACEコマンドを使用したいときなどに有効です。 次の例では,SET TRACEコマンドを使用して,トレースポイントで論理変数STATUS の値を検査しています。

     DBG> SET TRACE/SILENT %LINE 83 DO (EXAMINE STATUS)
     DBG> GO
        .
        .
        .
     SCREEN_IO\CLEAR\STATUS:   OFF
        .
        .
        .

次の例では,SET TRACEコマンドを使用して,12行目が実行された回数をカウントしています。 最初のDEFINE/VALUEコマンドは,シンボルCOUNTを定義し, その値を0に初期化します。SET TRACEコマンドのDO句は,COUNT を増分して,トレースポイントが検出されるたびに(12行目に到達するたびに) その値を評価します。

     DBG> DEFINE/VALUE COUNT=0
     DBG> SET TRACE/SILENT %LINE 12 DO (DEF/VAL COUNT=COUNT+1;EVAL COUNT)

ソース行は,省略時の設定では,デバッグ中のモジュールのソース・コードが使用可能な場合に, ブレークポイント,トレースポイント,およびウォッチポイントで表示されます。 ユーザは,SET BREAK,SET TRACE,SET WATCHの各コマンドの/[NO]SOURCE修飾子およびSET STEP [NO]SOURCEコマンドを使用して, ソース行の表示を制御できます。ソース・コードの表示制御の概略, 特にブレークポイント,トレースポイント,およびウォッチポイントでの表示制御についての説明は, 第6 章を参照してください。

3.3.5 例外発生時点でのブレークポイントまたはトレースポイントの設定

SET BREAK/EXCEPTIONコマンドおよびSET TRACE/EXCEPTIONコマンドは,プログラムによって生成された任意の例外をそれぞれブレークポイントまたはトレースポイントとして扱うようデバッガに指示します。 ブレークポイントまたはトレースポイントは, アプリケーションによって定義された例外ハンドラの起動前に発生します。 例外ハンドラおよび条件ハンドラに関連するデバッグ方法については,13.5 節を参照してください。

3.3.6 イベント発生時点でのブレークポイントまたはトレースポイントの設定

SET BREAKコマンドおよびSET TRACEコマンドには,それぞれ/EVENT= event-name修飾子を使用できます。ユーザは,この修飾子を使用して, イベント名キーワードで示されるさまざまなイベントによって検出されるブレークポイントまたはトレースポイントを設定できます。 イベントおよびそのキーワードは現在,次のイベント機能について定義されています。

適切な機能およびイベント名キーワードは,プログラムがデバッガの制御下に置かれたときに定義されます。 現在のイベント機能と,対応するイベント名キーワードを示すには,SHOW EVENT_FACILITY コマンドを使用します。SET EVENT_FACILITY コマンドを使用すれば,ユーザはイベント機能を変更でき, デバッグ・コンテキストも変更できます。これは,複数言語プログラムの使用時に, あるイベント機能に対応するルーチンをデバッグしたいが, その機能が現在設定されていない,という場合に有効です。

次の例は,SCANイベント・ブレークポイントの設定方法を示しています。 このコマンドによって,デバッガは,任意の値に対してSCANトークンが作成されると必ずブレークするようになります。

     DBG> SET BREAK/EVENT=TOKEN

ブレークポイントまたはトレースポイントが検出されると,デバッガは検出される原因となったイベントを示し, 補足情報を提供します。

3.3.7 ブレークポイントまたはトレースポイントの無効化, 有効化,および取り消し

いったん設定されたブレークポイントまたはトレースポイントは,無効にしたり, 有効にしたり,また取り消したりすることができます。

ブレークポイントまたはトレースポイントを無効にするには,DEACTIVATE BREAK またはDEACTIVATE TRACEコマンドを入力します。これで, デバッガは,プログラムの実行中にそのブレークポイントまたはトレースポイントを無視するようになります。 いったん無効にしたブレークポイントまたはトレースポイントはあとで, たとえば呼び出し元のプログラムを再実行したときなど( 第1.3.3項参照)に再度有効にすることもできます。 無効にされたブレークポイントまたはトレースポイントは,SHOW BREAK コマンドを実行したときに表示されるリストでは無効なもとのして表示されます。

ブレークポイントまたはトレースポイントを有効にするには,ACTIVATE BREAK またはACTIVATE TRACEコマンドを使用します。これらのコマンドを使用すれば, プログラムの実行中にブレークポイントまたはトレースポイントが有効になります。

DEACTIVATE BREAK/ALLおよびACTIVATE BREAK/ALLコマンド( DEACTIVATE TRACE/ALLおよびACTIVATE TRACE/ALLコマンド)は,すべてのブレークポイントまたはトレースポイントに対して作用し, 特にRER UNコマンドを使用してプログラムを再実行するときに有効です。

ブレークポイントまたはトレースポイントを取り消すには,CANCEL BREAK またはCANCEL TRACEコマンドを使用します。取り消されたブレークポイントまたはトレースポイントは,SHOW BREAK またはSHOW TRACEコマンドで表示されるリストには載らなくなります。

これらのコマンドを使用する場合には,ブレークポイントまたはトレースポイントの設定時と全く同じようにして, アドレス式と(必要であれば)修飾子を指定します。 次に例を示します。

     DBG> DEACTIVATE TRACE/LINE
     DBG> CANCEL BREAK SWAP,MOD2\LOOP4,2753

3.4 変数および他のプログラム記憶位置の変更のモニタ

SET WATCHコマンドを使用すれば,デバッガがプログラムの実行中にモニタするプログラム変数または任意のメモリ記憶位置を指定できます。 このプロセスを, ウォッチポイントの設定といいます。ウォッチされている変数またはメモリ記憶位置の値がプログラム実行中に変更されると, ウォッチポイントが検出されます。 デバッガは実行を中断し情報を表示して,コマンド入力用プロンプトを表示します。 デバッガは,プログラムの実行中は常にウォッチポイントをモニタします。

この節では,SET WATCHコマンドの使用方法の概略を説明します。非静的変数, すなわち呼び出しスタック上またはレジスタ内に割り当てられる変数へのウォッチポイントの設定についての詳しい説明は, 第3.4.3項を参照してください。


注意
SET WATCHコマンドを変数名または任意のシンボリック・ アドレス式といっしょに使用する場合,モジュールの設定あるいは有効範囲かパス名の指定が必要になることがあります。 これらの概念については,第5章で詳しく説明します。 以下の例では,すべてのモジュールが設定され,すべての変数名が一意に定義されるものと想定します。

コンパイル時にプログラムの最適化を行うと, プログラム内のある変数がコンパイラによって除去されることがあります。 このような変数にウォッチポイントを設定しようとすると, デバッガは警告を発行します(第1.2 節および第14.1節を参照)。


SET WATCHコマンドの構文は次のとおりです。

     SET WATCH[/qualifier[ . . .]] address-expression[,  . . . ]
     [WHEN (conditional-expression)]
     [DO (command[;  . . . ])]

ユーザは,任意の有効なアドレス式を指定できますが,通常は変数名を指定します。 次に,典型的なSET WATCHコマンドの使用例と,ウォッチポイントでのデバッガの省略時の動作の概略を示します。

     DBG> SET WATCH COUNT
     DBG> GO
        .
        .
        .
     watch of MOD2\COUNT at MOD2\%LINE 24
          24:   COUNT := COUNT + 1;
         old value: 27
         new value: 28
     break at MOD2\%LINE 25
          25:   END;
     DBG>

この例では,SET WATCHコマンドによって,変数COUNTにウォッチポイントが設定され,GO コマンドで実行が開始されます。プログラムが変数COUNT の値を変更すると,実行は一時停止します。その後デバッガは次の作業を実行します。

ウォッチされている変数の値を変更した命令のアドレスが,ソース行の先頭でない場合, デバッガは,行番号に行の先頭からのバイト・オフセットを追加することによって, その命令の記憶位置を示します。次に例を示します。

     DBG> SET WATCH K
     DBG> GO
        .
        .
        .
     watch of TEST\K at TEST\%LINE 19+5
          19:   DO 40 K = 1, J
         old value: 4
         new value: 5
     break at TEST\%LINE 19+9
          19:   DO 40 K = 1, J
     DBG>

この例では,変数Kを変更した命令のアドレスは,19行目の先頭から5バイトの位置です。 ブレークポイントは,変数値を変更した命令の次の命令にあることに注意してください。 前の例のように次のソース行の先頭ではありません。

ウォッチポイントは,集合体,すなわち全配列および全レコードに設定することができます。 配列またはレコードに設定されたウォッチポイントは, その配列またはレコード内の任意の要素が変更されると検出されます。 したがって,個々の配列要素またはレコード構成要素にウォッチポイントを設定する必要はありません。 ただし,可変長レコードには集合体ウォッチポイントを設定できません。 次の例では,配列ARRの第3要素が変更されたためウォッチポイントが検出されています。

     DBG> SET WATCH ARR
     DBG> GO
        .
        .
        .
     watch of SUBR\ARR at SUBR\%LINE 12
         12:     ARR(3) := 28
        old value:
         (1):         7
         (2):         12
         (3):         3
         (4):         0

        new value:
         (1):         7
         (2):         12
         (3):         28
         (4):         0

     break at SUBR\%LINE 13
     DBG>

ウォッチポイントは,レコードの構成要素,個々の配列要素,または配列断面( 配列要素の範囲)にも設定できます。配列断面に設定されたウォッチポイントは, その配列断面内の任意の要素が変更されたときに検出されます。 ウォッチポイント設定時には,現在の言語の構文を使用します。たとえば, 次のコマンドは,Pascalの構文を使用して配列CHECKの第7要素にウォッチポイントを設定します。

     DBG> SET WATCH CHECK[7]

現在設定されているすべてのウォッチポイントを示すには,SHOW WATCHコマンドを使用します。

3.4.1 ウォッチポイントの無効化,有効化, および取り消し

いったん設定されたウォッチポイントは,無効にしたり,有効にしたり, また取り消したりすることができます。

ウォッチポイントを無効にするには,DEACTIVATE WATCHコマンドを入力します。 これで,デバッガは,プログラムの実行中にウォッチポイントを無視するようになります。 いったん無効にしたウォッチポイントをあとで, たとえば呼び出し元のプログラムを再実行したときなど( 第1.3.3項を参照)に再度有効にすることもできます。 無効にされたウォッチポイントは,SHOW WATCHコマンドを実行したときに表示されるリストでは無効なものとして表示されます。

ウォッチポイントを有効にするには,ACTIVATE WATCHコマンドを使用します。 このコマンドを使用すれば,プログラムの実行中にウォッチポイントが有効になります。 静的ウォッチポイントはいつでも有効にできますが, その変数が定義されている有効範囲外に実行が移ると,非静的なウォッチポイントは取り消されます( 第3.4.3項を参照) 。

DEACTIVATE WATCH/ALLコマンドおよびACTIVATE WATCH/ALLコマンドは,すべてのウォッチポイントに対し作用し, 特にRERUNコマンドを使用してプログラムを再実行するときに有効です。

ウォッチポイントを取り消すには,CANCEL WATCHコマンドを使用します。 取り消されたウォッチポイントは,SHOW WATCHコマンドで表示されるリストには載らなくなります。

3.4.2 ウォッチポイント・オプション

SET WATCHコマンドには,SET BREAKコマンドおよびSET TRACEコマンドでのブレークポイントおよびトレースポイント用のオプションと同じオプションがあり, これらのオプションによってウォッチポイントでのデバッガの動作を制御しています。 すなわち,/AFTER,/[NO]SILENT, /[NO]SOURCE,および/TEMPORARYの各修飾子とオプションのWHEN句とDO句です。 これらの使用例は,第3.3.4項を参照してください。

3.4.3 非静的変数のウォッチ


注意
ここでは総称して非静的変数という用語を使用しますが, ある言語では自動変数と呼ぶ場合もあります。

プログラム変数の記憶領域は,静的または非静的に割り当てられます。静的変数はプログラムの実行が終了するまで, 常に同じメモリ・アドレスに対応づけられます。 非静的変数は,呼び出しスタック上またはレジスタ内に割り当てられます。 また,非静的編集が値を持つのは,その変数を定義しているルーチンがアクティブなときだけ, つまり呼び出しスタック上にあるときだけです。 ここで説明するように,ウォッチポイントの設定方法, ウォッチポイントの動作,およびプログラムの実行速度は,その変数が静的変数か非静的変数かによって異なります。

変数がどのように割り当てられているかを知るには,EVALUATE/ADDRESSコマンドを使用します。 静的変数は通常,P0空間内(16進数で0から3FFFFFFF まで)にアドレスを持ちます。非静的変数は通常,P1空間内(16進数で40000000 から7FFFFFFFまで)にアドレスを持つか,またはレジスタ内に格納されます。 次のPascalのコード例では,Xが静的変数として宣言されています。 一方,Yは省略時の設定によって非静的変数です。EVALUATE /ADDRESSコマンドがデバッグ中に入力され,Xはメモリ記憶位置512に,Y はR0レジスタ内にそれぞれ割り当てられていることが示されています。

        .
        .
        .
     VAR
          X: [STATIC] INTEGER;
          Y: INTEGER;
        .
        .
        .
     DBG> EVALUATE/ADDRESS X
     512
     DBG> EVALUATE/ADDRESS Y
     %R0
     DBG>

SET WATCHコマンドを使用する場合,次の違いに注意してください。静的変数にウォッチポイントを設定するのは, プログラムの実行中ならいつでも可能ですが, 非静的変数にウォッチポイントを設定できるのは,その変数を定義しているルーチンの有効範囲内で実行が停止しているときだけです。 それ以外の場合には,デバッガは次のような警告を発行します。

     DBG> SET WATCH Y
     %DEBUG-W-SYMNOTACT, nonstatic variable 'MOD4\ROUT3\Y'
         is not active
     DBG>

非静的変数にウォッチポイントを設定する方法については,第3.4.3.2項を参照してください。

3.4.3.1 実行速度

ウォッチポイントを設定した場合,プログラムの実行速度は変数が静的変数であるか非静的変数であるかによって異なります。 静的変数のウォッチでは, デバッガはその変数を含むページを書き込み禁止にします。プログラムがそのページに書き込もうとすると( その変数の値を変更しようとすると) ,アクセス違反エラーが発生し,デバッガが例外を処理します。すなわち, 一時的にそのページに対する書き込み禁止を解除して,命令を終了させ, ウォッチされている変数が変更されたかどうかを決定します。そのページに書き込むとき以外は, プログラムは最大速度で実行されます。

呼び出しスタックまたはレジスタを書き込み禁止にすると問題が発生するので, デバッガは,非静的変数をウォッチするために別の方法を使用します。 すなわち,その変数を定義しているルーチン内の各命令をトレースし, 命令の実行後,変数値をチェックします。これは,プログラムの実行速度を著しく低下させるので, デバッガは非静的変数にウォッチポイントが設定されると, 次のようなメッセージを発行します。

     DBG> SET WATCH Y
     %DEBUG-I-WPTTRACE, nonstatic watchpoint, tracing every instruction
     DBG>

3.4.3.2 非静的変数へのウォッチポイントの設定

非静的変数にウォッチポイントを設定する場合,その変数を定義しているルーチン内で実行が停止していることを確認します。 これを簡単に行うには, そのルーチンにトレースポイントを設定して,さらに変数にウォッチポイントを設定するDO 句を指定します。こうしておけば,そのルーチンが呼ばれるたびにトレースポイントが検出され, ルーチン内のローカル変数に対して自動的にウォッチポイントが設定されます。 次の例では, WPTTRACEメッセージによって,ウォッチポイントがルーチンROUT3のローカル非静的変数であるY に設定されたことが分かります。

     DBG> SET TRACE/NOSOURCE ROUT3 DO (SET WATCH Y)
     DBG> GO
        .
        .
        .
     trace at routine MOD4\ROUT3
     %DEBUG-I-WPTTRACE, nonstatic watchpoint, tracing every instruction
        .
        .
        .
     watch of MOD4\ROUT3\Y at MOD4\ROUT3\%LINE 16
        16:     Y := 4
        old value:    3
        new value:    4
     break at MOD4\ROUT3\%LINE 17
        17:     SWAP(X,Y);
     DBG>

実行が,ルーチンROUT3の呼び出し元に復帰すると,変数Yはアクティブでなくなります。 したがって,デバッガは自動的にウォッチポイントを取り消し, 次のようなメッセージを発行します。

     %DEBUG-I-WATCHVAR, watched variable MOD4\ROUT3\Y has gone out of scope
     %DEBUG-I-WATCHCAN, watchpoint now canceled

3.4.3.3 非静的変数のウォッチ・ オプション

SET WATCHコマンドの修飾子/OVER,/INTO,および/[NO]STATICには,非静的変数をウォッチするときのオプションがあります。

非静的変数にウォッチポイントを設定する場合,ルーチン呼び出し時に, 次の2つのうちいずれかを実行するようデバッガに指示できます。

SET WATCH/OVERコマンドを使用したほうが,性能が良くなります。ただし, 呼び出されたルーチンがウォッチされている変数を変更した場合は, 実行が呼び出し元に戻ってから,ウォッチポイントが検出されます。SET WATCH/INTOコマンドは,プログラムの実行速度を低下させますが,呼び出されたルーチン内でより正確にウォッチポイントをモニタできます。

デバッガは,変数のアドレス(P0空間,P1空間,またはレジスタ)を見ることによって, その変数が静的変数であるか非静的変数であるかを決定します。 ユーザは,SET WATCHコマンドの入力時に/[NO]STATIC修飾子を指定することで, この決定を上書きすることができます。たとえば,P1空間内に非スタック領域を割り当てた場合は,SET WATCH/STATIC コマンドを使用して, その変数はP1空間内に存在しても静的変数であることを指定します。 反対に,自分自身の呼び出しスタックをP0空間内に割り当てた場合には, SET WATCH/NOSTATICコマンドを使用して,その変数はP0空間内に存在しても非静的変数であることを指定します。

3.4.3.4 インストールされた書き込み可能な共用可能イメージへのウォッチポイントの設定

インストールされた書き込み可能な共用可能イメージにウォッチポイントを設定するには,SET WATCH/NOSTATIC コマンドを使用します( 第3.4.3.3項を参照)。

非静的なウォッチポイントを設定しなければならない理由は,次のとおりです。 このような共用可能イメージ内で宣言された変数は通常,静的変数です。 省略時の設定では,デバッガは,その変数を含むページを書き込み禁止にすることによって静的変数をウォッチします。 しかし,インストールされた書き込み可能な共用可能イメージ内のページを, 書き込み禁止にすることはできません。 したがって,デバッガは,非静的変数の場合と同じように, 変数値の変更を発見するために性能の良くない手法を使用しなければなりません。 すなわち,個々の命令が実行されるたびに,ウォッチされている記憶位置の値を調べる方法です( 第3.4.3.1項を参照)。

他のプロセスが,ウォッチされている記憶位置の値を変更したとしても, デバッガは,ユーザのプログラムがその値を変更したと報告する可能性があります。


[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]