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
デバッガ・コマンド・ディクショナリ


前へ 次へ 目次 索引



SET WATCH

アドレス式で示された記憶位置にウォッチポイントを設定します。

形式

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


パラメータ

address-expression

ウォッチポイントを設定するアドレス式 ( プログラム記憶位置 ) を指定します。高級言語の場合,これはたいていはプログラム変数です。変数を一意に指定するパス名をいれることができます。また,アドレス式はメモリ・アドレスまたはレジスタの場合もあります。数字 ( オフセット ) とシンボルで構成したり,1 つまたは複数の演算子,オペランド,または区切り文字で構成したりできます。アドレス式で使用できる演算子についての詳しい説明は, HELP Address_Expressionsをタイプしてください。

ワイルドカード文字のアスタリスク (*) は使用できません。

conditional-expression

現在設定されている言語で条件式を指定します。この式は実行がウォッチポイントに達したときに評価されます。デバッガは,実行がウォッチポイントに達すると,WHEN 句にある式の構文をチェックします。式が真であれば,デバッガはウォッチポイントが発生したことを報告します。ブレーク・アクション (DO 句 ) がブレークポイントと関連付けられている場合は,同時に発生します。式が偽の場合は報告されません。また,DO 句 ( 指定されている場合 ) によって指定されたコマンドは実行されず,プログラム実行が続行されます。

command

ウォッチ・アクションが実行されたときに,実行するデバッガ・コマンドを DO 句の一部として指定します。デバッガは,ウォッチポイントが設定されたときではなく,DO 句を実行したときに,DO 句にある式の構文をチェックします。

修飾子

/AFTER:n

指定されたウォッチポイントが n 回 (n は10 進整数 ) 検出されるまで,ウォッチ・アクションを実行しないことを指定します。それ以降は,WHEN 句の条件 ( 指定された場合 ) が真ならば,検出されるたびにウォッチポイントが発生します。 SET WATCH/AFTER:1 コマンドは,SET WATCH と同じです。

/INTO

定義ルーチン内だけでなく定義ルーチンから呼び出されたルーチン内 ( およびそのようにネストしたそれ以外の呼び出しから呼び出されたルーチン内 ) の命令もトレースすることにより,非静的変数をデバッガがモニタするよう指定します。 SET WATCH/INTO コマンドを使用すると,呼び出されたルーチン内の非静的変数を SET WATCH/OVER を使用したときよりも正確にモニタできます。ただし,呼び出されたルーチンにおける実行速度は SET WATCH/OVER の方が速くなります。

/OVER

定義ルーチンが呼び出すルーチン内でなく定義ルーチン内だけで命令のトレースを行うことによって,非静的変数のモニタをデバッガが行うよう指定します。その結果,デバッガは呼び出されたルーチンを通常の速度でモニタし,定義ルーチンに実行が戻ったときだけ命令のトレースを再開します。SET WATCH/OVER コマンドは SET WATCH/INTO より実行速度が速くなります。しかし,呼び出されたルーチンがウォッチされる変数を変更すると定義ルーチンに戻ったときだけ実行が割り込まれます。非静的変数にウォッチポイントを設定する場合, SET WATCH/OVER が省略時の設定です。

/SILENT

/NOSILENT (省略時の設定)

"watch..." メッセージと,現在の記憶位置のソース行をウォッチポイントで表示するかどうかを制御します。/NOSILENT 修飾子を指定すると,メッセージが表示されます。 /SILENT 修飾子を指定すると,メッセージとソース行は表示されません。 /SILENT 修飾子を指定すると,/SOURCE は上書きされます。

/SOURCE (省略時の設定)

/NOSOURCE

現在の記憶位置のソース行をウォッチポイントで表示するかどうかを制御します。/SOURCE 修飾子を指定すると,ソース行が表示されます。 /NOSOURCE 修飾子を指定すると,ソース行は表示されません。 /SILENT 修飾子を指定すると,/SOURCE は上書きされます。 SET STEP [NO]SOURCE コマンドも参照してください。

/STATIC

/NOSTATIC

指定された変数 ( ウォッチポイント記憶位置 ) が静的か非静的かについてのデバッガの省略時の判定を上書きすることができます。 /STATIC 修飾子を指定すると,デバッガは変数が P1 空間に割り当てられていても変数を静的変数として扱います。この結果,デバッガは各命令をトレースする代わりに,高速の書き込み保護モードを使用して記憶位置をモニタできます。 /NOSTATIC 修飾子を指定すると,デバッガは変数が P0 空間に割り当てられていても変数を非静的変数として扱わなければなりません。このため,デバッガは各命令をトレースして記憶位置をモニタします。したがって,これらの修飾子を使用する場合には,注意が必要です。

/TEMPORARY

ウォッチポイントを検出したあとでそのウォッチポイントを消去します ( ウォッチポイントを一時的に設定するときに使用します )。

説明

命令でウォッチポイント記憶位置を変更すると,デバッガは次の処理を実行します。

  1. その命令が実行を完了したあと,プログラム実行を中断する。

  2. ウォッチポイントの設定時に /AFTER を指定した場合,AFTER 回数をチェックする。指定された回数に達していないと実行が再開され,デバッガは残りのステップを実行しない。

  3. ウォッチポイントの設定時に WHEN 句を指定した場合,WHEN 句の式を評価する。式の値が偽であれば実行が続行され,デバッガは残りのステップを実行しない。

  4. /SILENT を指定していなければ,実行がウォッチポイント記憶位置に達したことを報告する ("watchof...")。

  5. ウォッチポイント記憶位置での古い ( 変更前の ) 値を報告する。

  6. ウォッチポイント記憶位置での新しい ( 変更後の ) 値を報告する。

  7. ウォッチポイント設定時に /NOSOURCE も /SILENT も指定しないか,または SET STEP NOSOURCE コマンドを入力していない場合,実行を中断したソース・コード行を表示する。

  8. ウォッチポイント設定時に DO 句を指定していれば,その DO 句内のコマンドを実行する。DO 句に GO コマンドが含まれていれば実行を続行し,デバッガは次のステップを実行しない。

  9. プロンプトを表示する。

高級言語の場合,SET WATCH コマンドで指定するアドレス式はたいてい変数です。コンパイラ生成型に対応した絶対メモリ・アドレスを指定すると,デバッガはそのアドレスをシンボル化し,その型に対応したバイト長を使用して,ウォッチポイント記憶位置のバイト長を決定します。デバッガがコンパイラ生成型と関連づけることができない絶対メモリ・アドレスが指定されると,デバッガはアドレス式が示すバイトで始まる 4 バイト ( 省略時の設定 ) のメモリをモニタします。ただし,この長さは,入力を WORD (SET TYPE WORD, 省略時の長さを 2 バイトに変更します ) か BYTE (SET TYPE BYTE, 省略時の長さを 1バイトに変更します ) に設定すれば変更できます。 SET TYPE LONGWORD を指定すると,省略時の長さは4 バイトに戻ります。

たとえば,次のような範囲にウォッチポイントを設定できます。


SET WATCH 30000:300018 

デバッガは,この範囲をカバーするロングワード・ウォッチ群を設定します。

集合体 ( すなわち,配列全体またはレコード全体 ) にウォッチポイントを設定できます。この場合,配列またはレコードのいずれかの要素が変化すると,配列またはレコードに設定したウォッチポイントが検出されます。このため,個々の配列要素やレコードの構成要素にウォッチポイントを設定する必要はありません。ただし,可変レコードには集合体のウォッチポイントを設定できないことに注意してください。

レコードの構成要素,個々の配列要素,配列断面 ( ある範囲の配列要素 ) にもウォッチポイントを設定できます。この場合,配列断面内のいずれかの要素が変化すればウォッチポイントが検出されます。ウォッチポイントは,現在の言語の構文に従って設定します。

次の修飾子は,ウォッチポイントに達したときにどんな出力を表示するのかを決定します。

/[NO]SILENT
/[NO]SOURCE

次の修飾子は,ウォッチポイントのタイミングと期間を決定します。

/AFTER:n
/TEMPORARY

次の修飾子は非静的変数にだけ指定します。

/INTO
/OVER

次の修飾子は,デバッガによる変数が静的か非静的かの判定を上書きするのに使用します。

/[NO]STATIC

注意

VAX システムでは,アドレスがグローバル・セクションにある変数に設定したウォッチポイントは動作しません。グローバル・セクション内の記憶位置にウォッチポイントを設定しようとすると, %DEBUG-E-BADWATCH メッセージが表示されます。

静的ウォッチポイントと非静的ウォッチポイント

ウォッチポイントの設定方法は変数が静的か非静的かで異なります。

静的変数はプログラムの実行中ずっと同じメモリ・アドレスに関連づけられています。したがって,実行中は静的変数にウォッチポイントをずっと設定しておくことができます。

非静的変数は呼び出しスタックかレジスタに割り当てられ,その定義ルーチンがアクティブである場合だけ値を持ちます ( 呼び出しスタック上に存在します )。このため,定義ルーチン ( 定義ルーチンが呼び出した任意のルーチンを含む ) の有効範囲内で実行が現在中断しているときだけ,非静的変数にウォッチポイントを設定できます。定義ルーチンから制御が戻ると,ウォッチポイントは取り消されます。非静的変数を使用した場合,デバッガは,すべての命令をトレースしてウォッチされた変数または位置に変更があるかどうかを検出します。

静的ウォッチポイントと非静的ウォッチポイントは実行速度も異なります。静的変数をウォッチする場合,デバッガはその変数を含むページを書き込み保護にします。プログラムがそのページに書き込もうとすると,アクセス違反が発生しデバッガが例外を処理し,ウォッチしている変数の内容が変更されたかどうかを調べます。そのページへの書き込みが発生しないかぎりプログラムは通常の速度で実行します。

非静的変数をウォッチするには,変数の定義ルーチン内の各命令をトレースし,各命令実行後に変数の値を調べます。このため,実行が極めて遅くなるので,非静的ウォッチポイントを設定すると,メッセージが発行されます。

次に説明するように,/[NO]STATIC,/INTO,/OVER を使用すれば,変数をウォッチするときに実行速度やその他の要因をある程度制御できます。

デバッガは,変数の割り当てを調べて,静的か非静的かを判断します。通常,静的変数は P0 空間 (0 から 3FFFFFFF,16 進数 ) に,非静的変数は P1 空間 (40000000 から 7FFFFFFF) またはレジスタに割り当てられます。定義ルーチンの有効範囲内で現在実行が中断していないときに,P1 空間またはレジスタに割り当てられた変数にウォッチポイントを設定しようとすると,デバッガは警告を出力します。

/[NO]STATIC 修飾子を指定すると,この省略時の動作を上書きできます。たとえば,P1 空間に非スタック記憶を割り当てた場合,その記憶領域に割り当てられた変数にウォッチポイントを設定するときには /STATIC を使用します。こうすれば,デバッガは各命令をトレースする代わりにもっと高速の書き込み保護による記憶位置のウォッチ方法を使用できます。たとえば,逆に P0 空間にユーザの呼び出しスタックを割り当てた場合,呼び出しスタックに割り当てられた変数にウォッチポイントを設定するときには,/NOSTATIC を使用します。こうすれば,デバッガはウォッチポイントを非静的ウォッチポイントとして扱うことができます。

/INTO および /OVER を使用すれば,呼び出されたルーチン内の非静的ウォッチポイントの実行速度も制御できます。

Alpha および VAX プロセッサの両方で,静的ウォッチポイントと非静的ウォッチポイントの両方が使用できます。静的ウォッチポイントを使用した場合,デバッガは,ウォッチする変数が保存されているメモリのページを書き込み保護します。このため,デバッガのシステム・サービス割り込み (SSI) のためでなければ,静的ウォッチポイントは,システム・サービス自体とインタフェースをとります。

静的ウォッチポイントが有効な場合,システム・サービス割り込みを通して,システム・サービス呼び出しの前にデバッガは,静的ウォッチポイント,非同期トラップ (AST),およびスレッド・スイッチを非アクティブにします。デバッガは,システム・サービス呼び出しが完了するとすぐに,ウォッチポイント,使用可能なAST,スレッド・スイッチを元の状態に戻し,最後にウォッチポイントのヒットをチェックします。この動作は,ウォッチポイントが非アクティブにされても,システム・サービスが通常どおりに動作し ( 書き込み保護のページなし ), AST コードまたは異なるスレッドが,ウォッチポイントする位置に変更の可能性がないように設計されています。お使いのアプリケーションで AST が使用可能かどうかをテストする場合などは,この動作に気をつけてください。

システム・サービスが system service interception (SSI) 機能 (OpenVMS VAX システムでは DBGSSISHR, OpenVMS Alpha システムでは SYS$SSISHR) でサポートされない場合,アクティブな静的ウォッチポイントが検出されると,システム・サービスは異常終了し,ほとんどの場合,ACCVIO 状態になります。 SYS$PUBLIC_VECTORS に存在しないシステム・サービスは SSI でサポートされません。これにはユーザ作成システム・サービス (UWSS) や, $MOUNT などのロード可能なシステム・サービスも含まれます。

静的ウォッチポイントがアクティブな場合には,デバッガはウォッチされる変数を含むページを書き込み禁止にします。SSI でサポートされないシステム・サービス呼び出しは,ユーザ・メモリのそのページに書き込もうとしたときに,異常終了します。

この問題を回避するには,次のいずれかの処理を実行してください。

システム・サービス・ルーチンの途中でウォッチしている記憶位置が変化した場合には,通常と同様に,ウォッチポイントが発生したことが通知されます。非常にまれですが,スタックでユーザ・プログラムのフレームの上に 1 つ以上のデバッガ・フレームが表示されることがあります。この問題を回避するには,1 つ以上の STEP/RETURN コマンドを入力して,プログラムに戻ります。

省略時の設定では,system service interception (SSI) はオンですが, Alpha プロセッサの場合のみ,次のコマンドを使用して,デバッグ・セッションの前にインターセプションを無効に設定できます。


$  DEFINE SSI$AUTO_ACTIVATE OFF

system service interception (SSI) を再度有効にするには,次のいずれかのコマンドを使用します。


$  DEFINE SSI$AUTO_ACTIVATE ON
$  DEASSIGN SSI$AUTO_ACTIVATE

グローバル・セクション・ウォッチポイント (Alpha および I64 のみ)

Alpha プロセッサでは,グローバル・セクションの変数または任意のプログラム記憶位置にウォッチポイントを設定できます。グローバル・セクションとは,マルチプロセス・プログラムのすべてのプロセスで共用されるメモリ領域です。グローバル・セクション内の記憶位置に設定されたウォッチポイント (グローバル・セクション・ウォッチポイント) は,プロセスがその記憶位置の内容を変更したときに起動されます。

グローバル・セクション・ウォッチポイントは,静的変数にウォッチポイントを設定するときと同じ方法で設定します。しかし,デバッガがグローバル・セクション・ウォッチポイントをモニタする方法により,次の点に注意する必要があります。ウォッチポイントを配列またはレコードに設定する場合には,SET WATCH コマンドを使用して構造体全体を指定するより,個々の要素を指定する方が性能を向上できます。

グローバル・セクションにまだマッピングされていない記憶位置にウォッチポイントを設定すると,そのウォッチポイントは通常の静的ウォッチポイントとして取り扱われます。そのあとで記憶位置がグローバル・セクションにマッピングされると,ウォッチポイントは自動的にグローバル・セクション・ウォッチポイントとして取り扱われるようになり,情報メッセージが出力されます。その後,ウォッチポイントはマルチプロセス・プログラムの各プロセスから確認できます。

関連コマンド

(ACTIVATE,DEACTIVATE,SHOW,CANCEL) WATCH
MONITOR
SET BREAK
SET STEP [NO]SOURCE
SET TRACE

#1

DBG> SET WATCH MAXCOUNT

このコマンドは変数 MAXCOUNT にウォッチポイントを設定します。

#2

DBG> SET WATCH ARR
DBG> GO
    ...
watch of SUBR\ARR at SUBR\%LINE 12+8 
   old value: 
    (1):         7 
    (2):         12 
    (3):         3 
   new value: 
    (1):         7 
    (2):         12 
    (3):         28 
 
break at SUBR\%LINE 14
DBG>

この例では,SET WATCH コマンドが 3 つの要素を持つ整数の配列 ARR にウォッチポイントを設定します。GO コマンドで実行を再開します。いずれかの配列要素の内容が変化するとウォッチポイントが検出されます。この例では,3 番目の要素が変化しています。

#3

DBG> SET WATCH ARR(3)

このコマンドは ARR 配列 (Fortran 配列構文) の要素 3 にウォッチポイントを設定します。要素 3 が変化するとウォッチポイントが検出されます。

#4

DBG> SET WATCH P_ARR[3:5]

このコマンドは,P_ARR 配列 (Pascal 配列構文 ) の要素 3 〜 5 で構成される配列断面にウォッチポイントを設定します。これらの要素のどれかが変化するとウォッチポイントが検出されます。

#5

DBG> SET WATCH P_ARR[3]:P_ARR[5]

このコマンドは,P_ARR 配列の要素 3〜5 のそれぞれに,個別にウォッチポイントを設定します (Pascal 配列構文 )。ターゲット要素が変化すると,各ウォッチポイントが起動されます。

#6

DBG> SET TRACE/SILENT SUB2 DO (SET WATCH K)

この例では,変数 K は非静的変数であり,その定義ルーチン SUB2 ( スタック上に存在します ) がアクティブのときだけ定義されます。 SET TRACE は SUB2 にトレースポイントを設定します。実行中にトレースポイントが検出されると,DO 句は K にウォッチポイントを設定します。SUB2 ルーチンから制御が戻るとウォッチポイントは取り消されます。 /SILENT 修飾子が指定されているので,トレースポイントを検出したときの "trace..." メッセージとソース・コードは表示されません。


前へ 次へ 目次 索引