library home hp.com home products and services support and drivers solutions
cd-rom home
End of Jump to page title
HP OpenVMS Systems
Documentation

Jump to content


HP OpenVMS

HP OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


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 項 を参照)。

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


第 4 章
プログラム・データの検査と操作

本章では,任意のプログラム記憶位置の内容とプログラム内で宣言したシンボルの値を表示したり変更したりするための EXAMINE コマンドと DEPOSIT コマンドの使用法について説明します。また,言語式を評価する EVALUATE などのコマンドの使用法についても説明します。

本章には次の内容が含まれています。

本章の例には言語固有のすべての動作が含まれているわけではありません。どの言語でデバッグを行う場合でも,次の説明を必ず参照してください。

4.1 概要

この節では EXAMINE,DEPOSIT,EVALUATE の各コマンドを紹介し,これらのコマンドに共通した概要を説明します。

4.1.1 デバッグ時の変数へのアクセス

注意

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

非静的 ( スタック・ローカルまたはレジスタ ) 変数を検査したり,そこに値を格納したりするには,その変数を定義しているルーチンが呼び出しスタック上でアクティブでなければなりません。すなわち,定義しているルーチン内のどこかでプログラムの実行が一時停止していなければなりません。非静的変数についての詳しい説明は, 第 3.4.3 項 を参照してください。

静的変数はプログラム実行中にいつでも検査でき,非静的変数は,それを定義しているルーチンへ到達したときに検査できます。しかし,変数を検査する前に,それが宣言され初期化されている場所を越えてプログラムを実行するようにしてください。初期化されていない変数に含まれる値は無効とみなさなければなりません。

多くのコンパイラでは,プログラムの実行速度を向上させるためにコードを最適化します。デバッグ中のコードが最適化されたものである場合は,プログラム記憶位置がソース・コードから予想したものと一致しないことがあります。特に,最適化技法の中には,特定の変数を排除するものがあるので,デバッグ時にそれらの変数へはアクセスできなくなります。

第 14.1 節 には,実行可能コードに対するいくつかの最適化技法の効果が説明されています。最初にプログラムをデバッグする場合は,できれば /NOOPTIMIZEまたはそれに相当するコンパイラ・コマンド修飾子を使用して最適化を禁止するのが最善の方法です。

EXAMINE コマンドまたは DEPOSIT コマンドを変数名,またはその他のシンボリック・アドレス式といっしょに使用する場合,モジュールの設定や有効範囲かパス名の指定が必要になることがあります。それらの概念は 第 5 章 で説明します。本章の例では,すべてのモジュールが設定され,すべての変数名が固有に定義されることと想定しています。

4.1.2 EXAMINE コマンドの使用

高級言語プログラムでは,EXAMINE コマンドはほとんどの場合,変数の現在の値を表示するために使用され,次の構文をとります。


EXAMINE address-expression[,...] 

たとえば次のコマンドは整変数 X の現在の値を表示します。


DBG> EXAMINE X
MOD3\X:   17
DBG>

値を表示する場合,デバッガは変数名の前にパス名 ( この場合は変数 X が宣言されているモジュールの名前 ) を付けます ( 第 5.3.2 項 を参照 )。

一般的には,EXAMINE コマンドはアドレス式で表された要素の現在の値を,その記憶位置に対応づけられた型 ( たとえば,整数,実数,配列,レコードなど ) で表示します。

EXAMINE コマンドを入力すると,デバッガはプログラム記憶位置 ( メモリ・アドレスまたはレジスタ ) を得るためにアドレス式を評価します。その後,デバッガはその記憶位置に格納されている値を次のように表示します。

シンボリック・アドレス式および非シンボリック・アドレス式に対応する型についての詳しい説明は, 第 4.1.5 項 を参照してください。

省略時の設定では,デバッガは値を表示する場合にシンボル情報が入手できるのであれば,アドレス式とそのパス名をシンボルによって示します。アドレスのシンボル化についての詳しい説明は 第 4.1.11 項 を参照してください。

4.1.3 DUMP コマンドの使用

DCL の DUMP コマンドと同じ方法でメモリの内容を表示するには,次のいずれかの形式でデバッガの DUMP コマンドを使用します。

Binary
Byte
Decimal
Hexadecimal
Longword (省略時の設定)
Octal
Quadword
Word

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


DUMP address-expression1[:address-expression2] 

address-expression2 の省略時の設定は address-expression1 です。たとえば,次のコマンドはレジスタ R16〜R25 の現在の値をクォドワード形式で表示します。


DBG> DUMP/QUADWORD R16:R25
 0000000000000078 0000000000030038 8.......x....... %R16 
 000000202020786B 0000000000030041 A.......kx   ... %R18 
 0000000000030140 0000000000007800 .x......@....... %R20 
 0000000000010038 0000000000000007 ........8....... %R22 
 0000000000000006 0000000000000000 ................ %R24 
 
DBG> 

DUMP コマンドを使用すると,レジスタ,変数,配列の内容を表示できます。デバッガは配列の構造体を解釈しません。次の修飾子は,デバッガが DUMP コマンドからの出力を表示する方法を指定します。

修飾子 出力の形式
/BINARY 2 進整数
/BYTE 1 バイトの整数
/DECIMAL 10 進整数
/HEXADECIMAL 16 進整数
/LONGWORD ロングワード整数 (4 バイト長)
/OCTAL 8 進整数
/QUADWORD クォドワード整数 (8 バイト長)
/WORD ワード整数 (2 バイト長)

省略時の設定では,デバッガは,確認した値がコンパイラで生成されるデータ型でない場合,それをロングワードとして表示します。


前へ 次へ 目次 索引