Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


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]SOURCE,/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 コマンド)は,すべてのブレークポイントまたはトレースポイントに対して作用し,特に RERUN コマンドを使用してプログラムを再実行するときに有効です。

ブレークポイントまたはトレースポイントを取り消すには,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 項 を参照してください。


前へ 次へ 目次 索引