日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 部:デバッガ概要
第 1 章:デバッガ概要
第 2 部:コマンド・インタフェース
第 2 章:デバッガの起動
第 3 章:プログラム実行の制御とモニタ
第 4 章:プログラム・データの検査と操作
第 5 章:プログラム内シンボルへのアクセス制御
第 6 章:ソース・コードの表示の制御
第 7 章:画面モード
第 3 部:DECwindows インタフェース
第 8 章:DECwindows Motifインタフェースの概要
第 9 章:デバッグ・セッションの開始と終了
第 10 章:デバッガの使用方法
第 4 部:PC クライアント・インタフェース
第 11 章:デバッガの PC クライアント/サーバ・インタフェースの概要
第 5 部:高度なトピック
第 12 章:ヒープ・アナライザの使用
第 13 章:その他の便利な機能
第 14 章:特殊なデバッグ
第 15 章:マルチプロセス・プログラムのデバッグ
第 16 章:タスキング・プログラムのデバッグ
第 6 部:付録
付録 A :定義済みのキー機能
付録 B :組み込みシンボルと論理名
付録 C :各言語に対するデバッガ・サポートの要約
付録 D :EIGHTQUEENS.C
索引
PDF
OpenVMS ホーム

HP OpenVMS
デバッガ説明書


目次 索引



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

ウォッチポイントを無効にするには,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 項 を参照してください。

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

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

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



非静的変数にウォッチポイントを設定する場合,その変数を定義しているルーチン内で実行が停止していることを確認します。これを簡単に行うには,そのルーチンにトレースポイントを設定して,さらに変数にウォッチポイントを設定する 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



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

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

  • 呼び出されたルーチンを1ステップとして最大速度で実行し,呼び出し元に復帰後,命令のトレースを再開する。これは,省略時の設定である (SET WATCH/OVER)。

  • 呼び出されたルーチン内で命令をトレースする。すなわち,ルーチン内で命令が実行されるたびに,変数をモニタする(SET WATCH/INTO)。

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

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

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

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

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


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.