Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


2.3.4 ブレークポイントを使用したプログラムの実行の中断

SET BREAK コマンドを使用すれば,プログラムの実行を中断する記憶位置(ブレークポイント)を選択できます。実行が中断されると,ユーザは呼び出しスタックのチェック,変数の現在値の確認などを行うことができます。GO コマンドまたは STEP コマンドを使用して,ブレークポイントから実行を再開します。

次の例は,SET BREAKコマンドの典型的な使用方法を示したものです。


DBG> SET BREAK COUNT
DBG> GO
   .
   .
   .
break at routine PROG2\COUNT 
     54:  procedure COUNT(X,Y:INTEGER);
DBG>

この例では,SET BREAK コマンドは,ルーチン COUNT(ルーチン・コードの先頭)にブレークポイントを設定しています。そして,GO コマンドで実行を開始します。ルーチン COUNT に到達すると,次のようになります。

ユーザは,このブレークポイントで STEP コマンドを使用してルーチン COUNT をステップ実行したあと,EXAMINE コマンド( 第 2.4.1 項 を参照)を使用して,X および Y の値をチェックできます。

SET BREAK コマンドの使用時には,さまざまな アドレス式(たとえば,行番号,ルーチン名,メモリ・アドレス,バイト・オフセットなど)を使用してプログラム記憶位置を指定できます。高級言語では通常,ルーチン名,ラベル,または行番号を,必要に応じて一意性を保証するパス名とともに使用します。

ルーチン名とラベルは,ソース・コードに表示されるとおりに指定します。行番号は,ソース・コードのディスプレイまたはリスト・ファイル内から求めます。行番号を指定するには,接頭辞 %LINE を使用します。この接頭辞を指定しないと,デバッガは行番号をメモリ記憶位置と解釈してしまいます。たとえば,次のコマンドは,実行が一時停止しているモジュール内の 41 行目にブレークポイントを設定します。この結果,41 行目の先頭で実行が中断されます。


DBG> SET BREAK %LINE 41

ブレークポイントを設定できるのは,機械語コード命令に変換された行だけであることに注意してください。それ以外の行(たとえば,コメント行)にブレークポイントを設定しようとすると,デバッガは警告を発行します。実行が一時停止しているモジュール以外のモジュールの行番号を指定する場合は,パス名にモジュール名を含める必要があります。次に例を示します。


DBG> SET BREAK SCREEN_IO\%LINE 58

また,パラメータなしの修飾子付き SET BREAK コマンドを使用して,行ごと,または CALL 命令ごとにブレークさせることもできます。次に例を示します。


DBG> SET BREAK/LINE
DBG> SET BREAK/CALL

例外,またはタスキング・プログラム内の状態移行などの イベント 発生時に,ブレークポイントを設定することもできます。

WHEN 句を使用してブレークポイントを条件付きにしたり,DO 句を使用してブレークポイントで実行するコマンドの並びを指定することもできます。

現在のブレークポイントを表示するには,SHOW BREAK コマンドを入力します。

ブレークポイントを無効にするには,DEACTIVATE BREAK コマンドを使用します。その場合,ブレークポイントの設定時と全く同じようにプログラム記憶位置を指定します。これで,プログラム実行中にそのブレークポイントは無効になります。しかし,あとで(たとえばそのプログラムに復帰したときに(第 1.3.3 項 を参照))再度ブレークポイントを有効にできます。無効にされたブレークポイントは,SHOW BREAK の表示では無効であることが示されます。

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

DEACTIVATE BREAK/ALL コマンドと ACTIVATE BREAK/ALL コマンドは,すべてのブレークポイントに対して作用し,特にプログラムの再実行時に有効です。

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

2.3.5 トレースポイントを使用したプログラム実行のトレース

SET TRACE コマンドを使用すれば,プログラムの実行をトレースする記憶位置(トレースポイント)を選択できます。ただし,トレースポイントでプログラムの実行が停止することはありません。トレースポイントの設定後,ユーザは GO コマンドで実行を開始し,予期しない動作をチェックしながら実行パスをモニタできます。ルーチンにトレースポイントを設定すると,そのルーチンの呼び出し回数をモニタすることもできます。

ブレークポイントと同様,トレースポイントに到達するたびに,デバッガはメッセージを発行し,ソース行を表示します。しかし,プログラムはそのまま実行を続けるため,デバッガのプロンプトは表示されません。次に例を示します。


DBG> SET TRACE COUNT
DBG> GO
trace at routine PROG2\COUNT 
     54:  procedure COUNT(X,Y:INTEGER);
   .
   .
   .

ブレークポイントとトレースポイントの相違点は,この 1 点だけです。SET TRACE コマンドの使用時には,SET BREAK コマンドの場合と全く同じアドレス式,修飾子,およびオプション句を使用します。SHOW TRACE,ACTIVATE TRACE,DEACTIVATE TRACE,CANCEL TRACE の各コマンドは,トレースポイントに対してブレークポイントの対応するコマンドと同じように動作します(第 2.3.4 項 を参照)。

2.3.6 ウォッチポイントを使用した変数値の変化のモニタ

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

ウォッチポイントの設定方法は,システム(VAX または Alpha)および変数の型(静的変数または非静的変数)によって異なります。

VAX プロセッサでは,SET WATCH コマンドとともに変数名を指定することによって,静的変数にウォッチポイントを設定できます。静的変数 は,プログラムの実行中,常に同じメモリ・アドレスに関連づけられているため,静的変数名は常に意味があります。たとえば,次のコマンドは,変数 TOTAL にウォッチポイントを設定します。


DBG> SET WATCH TOTAL

このあと,プログラムが TOTAL の値を変更するたびに,ウォッチポイントが検出されます。

次の例は,ウォッチされている変数の内容をプログラムが変更すると次に何が起こるかを示しています。


DBG> SET WATCH TOTAL
DBG> GO
   .
   .
   .
watch of SCREEN_IO\TOTAL at SCREEN_IO\%LINE 13 
     13:   TOTAL = TOTAL + 1; 
    old value: 16 
    new value: 17 
break at SCREEN_IO\%LINE 14 
     14:   POP(TOTAL);
DBG>

この例では,ウォッチポイントが変数 TOTAL に設定され,実行が開始されます。変数 TOTAL の値が変化すると,実行は一時停止します。デバッガは,イベントの発生をユーザに知らせ("watch of..."),TOTAL が変化した位置(13 行目の先頭)と,対応するソース行を表示します。そし古い値と新しい値を表示し,次の行(14 行目)の先頭で実行を一時停止します。最後に,コマンド入力を要求するプロンプトを表示します。ソース行の先頭以外で変数値が変化した場合,デバッガは行番号と行の先頭からのバイト・オフセットを表示します。

VAX プロセッサおよび Alpha プロセッサでは,非静的変数を定義しているルーチンにトレースポイントを設定し,そのトレースポイントに到達するたびにウォッチポイントを設定する DO 句を指定することによって,その非静的変数にウォッチポイントを設定できます。非静的変数 は,スタック上またはレジスタ内に割り当てられ,その変数を定義しているルーチンが呼び出しスタック上でアクティブな場合にしか存在しないため,常に変数名が意味を持つわけではありません(静的変数名は常に意味があります)。

次の例では,ルーチン ROUT3 内の非静的変数Yにウォッチポイントが設定されています。トレースポイントが検出されると,WPTTRACE メッセージは非静的なウォッチポイントが設定されていることを示し,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>

呼び出し元ルーチンに制御が戻ると,非静的変数はアクティブでなくなるので,デバッガは自動的にウォッチポイントを取り消し,それを示すメッセージを発行します。

Alpha プロセッサでは,デバッガはすべてのウォッチポイントを非静的なウォッチポイントとみなします。

SHOW WATCH,ACTIVATE WATCH,DEACTIVATE WATCH,CANCEL WATCH の各コマンドは,ウォッチポイントに対してブレークポイントの対応するコマンドと同じように動作します(第 2.3.4 項 を参照)。ただし,非静的なウォッチポイントは,実行が,ウォッチされている変数の有効範囲内に含まれる間だけ存在します。

2.4 プログラム・データの検査と操作

この節では,EXAMINE,DEPOSIT,EVALUATE の各コマンドを使用して,変数の内容の表示や変更を行ったり,式を評価したりする方法を説明します。非静的変数の値を検査したり,値を格納したりするには,第 2.3.6 項 で定義したように,その非静的変数の定義ルーチンがアクティブでなければなりません。

2.4.1 変数値の表示

変数の現在の値を表示するには,EXAMINE コマンドを使用します。EXAMINE コマンドの構文は,次のとおりです。


EXAMINE address-expression

デバッガは,変数のコンパイラ生成データ型を認識し,それにしたがってデータを検索および編集します。次の例は,EXAMINE コマンドのいくつかの使用例です。

文字列変数の検査


DBG> EXAMINE EMPLOYEE_NAME
PAYROLL\EMPLOYEE_NAME:    "Peter C. Lombardi"
DBG>

3 つの整数変数の検査


DBG> EXAMINE WIDTH, LENGTH, AREA
SIZE\WIDTH:   4 
SIZE\LENGTH:  7 
SIZE\AREA:   28
DBG>

2 次元の実数配列の検査(1 次元当たり 3 要素)


DBG> EXAMINE REAL_ARRAY
PROG2\REAL_ARRAY 
  (1,1):       27.01000 
  (1,2):       31.00000 
  (1,3):       12.48000 
  (2,1):       15.08000 
  (2,2):       22.30000 
  (2,3):       18.73000
DBG>

1 次元文字配列の 4 番目の要素の検査


DBG> EXAMINE CHAR_ARRAY(4)
 
PROG2\CHAR_ARRAY(4): 'm'
DBG>

レコード変数の検査(COBOL の場合)


DBG> EXAMINE PART
INVENTORY\PART: 
    ITEM:     "WF-1247" 
    PRICE:     49.95 
    IN_STOCK:  24
DBG>

レコードの構成要素の検査(COBOL の場合)


DBG> EXAMINE IN_STOCK OF PART
INVENTORY\IN-STOCK of PART: 
    IN_STOCK:  24
DBG>

EXAMINE コマンドでは,プログラム記憶位置の内容を表示する場合,変数名だけでなく任意の種類のアドレス式を使用できます。デバッガは,型未定義の記憶位置には省略時のデータ型を割り当てます。あるデータを他のデータ形式で解釈,表示したい場合には,型付きおよび型のない位置の省略時の設定を上書きすることができます。

2.4.2 変数への値の代入

変数に新しい値を代入するには,DEPOSIT コマンドを使用します。DEPOSIT コマンドの構文は,次のとおりです。


DEPOSIT address-expression = language-expression

DEPOSIT コマンドは,ほとんどのプログラミング言語の代入文に似ています。

次の例では,DEPOSIT コマンドが,さまざまな変数に新しい値を代入しています。デバッガは,代入された値(言語式の場合もある)が変数のデータ型と次元の制約に矛盾しないことをチェックします。

文字列の代入(文字列は,二重引用符(")または一重引用符(')で囲まなければならない)


DBG> DEPOSIT PART_NUMBER = "WG-7619.3-84"

整数式の代入


DBG> DEPOSIT WIDTH = CURRENT_WIDTH + 10

文字配列の 12 番目の要素の代入(1 つの DEPOSIT コマンドで代入できるのは配列の 1 要素だけであり,配列全体を示す集合体は代入できない)


DBG> DEPOSIT C_ARRAY(12):= 'K'

レコードの構成要素の代入(1 つの DEPOSIT コマンドで代入できるのは,レコードの 1 構成要素だけであり,レコード全体を示す集合体は代入できない)


DBG> DEPOSIT EMPLOYEE.ZIPCODE = 02172

境界外の値の代入(X は正の整数として宣言されている)


DBG> DEPOSIT X = -14
%DEBUG-I-IVALOUTBNDS, value assigned is out of bounds 
        at or near DEPOSIT

EXAMINE コマンドの場合と同様,DEPOSIT コマンドでは,変数名だけでなく任意の種類のアドレス式を指定できます。あるデータを他のデータ形式で解釈したい場合は,型付きおよび型のない位置の省略時の設定を上書きすることができます。

2.4.3 言語式の評価

言語式を評価するには,EVALUATE コマンドを使用します。EVALUATE コマンドの構文は,次のとおりです。


EVALUATE language-expression

デバッガは,現在使用している言語の演算子および式の構文を認識します。次の例では,整変数 WIDTH に値 45 を代入しています。そして,EVALUATE コマンドを使用して,WIDTH の現在値と7の合計を求めています。


DBG> DEPOSIT WIDTH := 45
DBG> EVALUATE WIDTH + 7
52
DBG>

次の例では,論理変数 WILLING と ABLE に,それぞれ TRUE と FALSE を代入しています。そして,EVALUATE コマンドを使用して,この 2 つの値の論理積を求めます。


DBG> DEPOSIT WILLING := TRUE
DBG> DEPOSIT ABLE := FALSE
DBG> EVALUATE WILLING AND ABLE
False
DBG>

2.5 プログラム内シンボルへのアクセス制御

プログラムに関連するシンボル(変数名,ルーチン名,ソース・コード,行番号など)への完全なアクセスを保証するには,第 1.2 節 で説明したように,/DEBUG 修飾子を使用してプログラムをコンパイルおよびリンクしなければなりません。

これらの条件を満たしていれば,デバッガによるシンボルの処理方法は,ほとんどの場合,ユーザには見えません。ただし,次の2つの場合は,何らかの処置が必要です。

2.5.1 モジュールの設定と取り消し

シンボル検索を容易にするために,デバッガは,シンボル情報を実行可能なイメージから実行時シンボル・テーブル(RST)にロードします。これで,シンボル情報に効率的にアクセスできるようになります。シンボルが RST 内に存在しない場合,デバッガはそのシンボルを認識しないか,または正確に解釈しません。

RST はメモリ領域を占有するため,デバッガは,プログラムの実行中に参照されると思われるシンボルを予想しながら,動的にシンボルをロードします。特定のモジュールのすべてのシンボル情報が,一度に RST テーブル内にロードされるため,このロード処理を モジュール設定 と呼びます。

最初に,イメージ遷移アドレスを含むモジュールだけが設定されます。その後,プログラムの実行が中断するたびに,中断ルーチンを含むモジュールが設定されます。この結果,ユーザは,その記憶位置で見えなければならないシンボルを参照できるようになります。

設定されていないモジュール内のシンボルを参照しようとすると,デバッガは,シンボルがRSTに設定されていないことをユーザに警告します。次に例を示します。


DBG> EXAMINE K
%DEBUG-W-NOSYMBOL, symbol 'K' is not in symbol table
DBG>

このような場合は,SET MODULE コマンドを使用して,そのシンボルを含むモジュールを明示的に設定しなければなりません。次に例を示します。


DBG> SET MODULE MOD3
DBG> EXAMINE K
MOD3\ROUT2\K: 26
DBG>

SHOW MODULE コマンドは,プログラム内のモジュールをリストし,設定されているモジュールを識別します。

動的なモジュール設定は,設定されるモジュール数が増えるにしたがって,デバッガの処理速度を低下させます。性能の低下が問題になる場合は,CANCEL MODULE コマンドを使用して設定モジュール数を減らすか,または SET MODE NODYNAMIC コマンドを入力して動的モジュール設定を禁止します。動的モジュール設定を使用可能にするには,SET MODE DYNAMIC コマンドを使用します。


前へ 次へ 目次 索引