前へ | 次へ | 目次 | 索引 |
命令でウォッチポイント記憶位置を変更すると,デバッガは次の処理を実行します。
- その命令が実行を完了したあと,プログラム実行を中断する。
- ウォッチポイントの設定時に /AFTER を指定した場合,AFTER 回数をチェックする。指定された回数に達していないと実行が再開され,デバッガは残りのステップを実行しない。
- ウォッチポイントの設定時に WHEN 句を指定した場合,WHEN 句の式を評価する。式の値が偽であれば実行が続行され,デバッガは残りのステップを実行しない。
- /SILENT を指定していなければ,実行がウォッチポイント記憶位置に達したことを報告する("watchof...")。
- ウォッチポイント記憶位置での古い(変更前の)値を報告する。
- ウォッチポイント記憶位置での新しい(変更後の)値を報告する。
- ウォッチポイント設定時に /NOSOURCE も /SILENT も指定しないか,または SET STEP NOSOURCE コマンドを入力していない場合,実行を中断したソース・コード行を表示する。
- ウォッチポイント設定時に DO 句を指定していれば,その DO 句内のコマンドを実行する。DO 句に GO コマンドが含まれていれば実行を続行し,デバッガは次のステップを実行しない。
- プロンプトを表示する。
高級言語の場合,SET WATCH コマンドで指定するアドレス式はたいてい変数です。コンパイラ生成型に対応した絶対メモリ・アドレスを指定すると,デバッガはそのアドレスをシンボル化し,その型に対応したバイト長を使用して,ウォッチポイント記憶位置のバイト長を決定します。デバッガがコンパイラ生成型と関連づけることができない絶対メモリ・アドレスが指定されると,デバッガはアドレス式が示すバイトで始まる 4 バイト(省略時の設定)のメモリをモニタします。ただし,この長さは,入力を WORD(SET TYPE WORD, 省略時の長さを 2 バイトに変更します)か BYTE(SET TYPE BYTE, 省略時の長さを 1バイトに変更します)に設定すれば変更できます。SET TYPE LONGWORD を指定すると,省略時の長さは4 バイトに戻ります。
集合体(すなわち,配列全体またはレコード全体)にウォッチポイントを設定できます。この場合,配列またはレコードのいずれかの要素が変化すると,配列またはレコードに設定したウォッチポイントが検出されます。このため,個々の配列要素やレコードの構成要素にウォッチポイントを設定する必要はありません。ただし,可変レコードには集合体のウォッチポイントを設定できないことに注意してください。
レコードの構成要素,個々の配列要素,配列断面(ある範囲の配列要素)にもウォッチポイントを設定できます。この場合,配列断面内のいずれかの要素が変化すればウォッチポイントが検出されます。ウォッチポイントは,現在の言語の構文に従って設定します。
次の修飾子は,ウォッチポイントに達したときにどんな出力を表示するのかを決定します。
/[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 のみ)
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..." メッセージとソース・コードは表示されません。
画面ウィンドウ定義を作成します。
注意
このコマンドは,デバッガへの Compaq DECwindows Motif for OpenVMS ユーザ・インタフェースでは使用できません。
SET WINDOW window-name
AT(start-line,line-count
[,start-column,column-count])
window-name
定義するウィンドウの名前を指定します。その名前を持つウィンドウ定義がすでに存在するときには,古い定義は取り消され新しい定義が有効になります。start-line
ウィンドウの開始行番号を指定します。この行はウィンドウの表題またはヘッダ行を表示します。画面の最上行は行 1 です。line-count
ウィンドウのテキスト行の数を指定します。ヘッダ行は計算にいれません。この値の最小値は 1 です。start-line とline-countの合計は現在の画面の高さを超えてはなりません。start-column
ウィンドウの開始欄番号を指定します。これは,ウィンドウの最初の文字が表示される欄のことです。画面の最も左の欄は欄 1 です。column-count
ウィンドウの行当たりの文字数を指定します。最小値は 1 です。start-column と column-countの合計が現在の画面幅を超えてはなりません。
画面ウィンドウは端末画面上の長方形の領域で,これを通して表示を見ることができます。SET WINDOW コマンドはウィンドウ名と画面領域とを関連づけることによってウィンドウ定義を設定します。画面領域は,開始行と高さ(行数)で定義しますが,オプションで開始欄と幅(欄数)を指定します。開始欄と欄数を指定しないと,省略時の設定により欄 1 と現在の画面幅に設定されます。組み込みシンボル %PAGE と %WIDTH を使用した式でウィンドウ領域を指定することもできます。
SET WINDOW コマンドで定義したウィンドウの名前を DISPLAY コマンドで使用して画面上の表示位置を指定することもできます。
ウィンドウ定義は動的に行われます。すなわち,SET TERMINAL コマンドで端末の幅と高さを変更すると,それに比例してウィンドウのサイズも拡大または縮小します。
関連コマンド
DISPLAY
(SHOW,CANCEL)DISPLAY
(SET,SHOW)TERMINAL
(SHOW,CANCEL)WINDOW
#1 |
---|
DBG> SET WINDOW ONELINE AT(1,1) |
このコマンドは画面の最上部に ONELINE という名前のウィンドウを定義します。このウィンドウの高さは 1 行であり,幅は省略時の設定によって画面の幅に設定されます。
#2 |
---|
DBG> SET WINDOW MIDDLE AT(9,4,30,20) |
このコマンドは画面の中央に MIDDLE という名前のウィンドウを定義します。このウィンドウは行 9 から開始して 4 行の高さであり,欄 30 から開始して20 欄の幅に設定されます。
#3 |
---|
DBG> SET WINDOW FLEX AT(%PAGE/4,%PAGE/2,%WIDTH/4,%WIDTH/2) |
このコマンドは画面の中央を付近に FLEX という名前のウィンドウを定義します。このウィンドウは現在の画面の高さ(%PAGE)と幅(%WIDTH)に定義されます。
デバッガ・コマンドの実行を強制終了するか,またはプログラムの実行に割り込みをかける機能として現在定義されている Ctrl キー・シーケンスを示します。
注意
このコマンドは,デバッガへの Compaq DECwindows Motif for OpenVMS ユーザ・インタフェースでは使用できません。
SHOW ABORT_KEY
省略時の設定では,デバッグ・セッション中に Ctrl/C を入力すると,デバッガ・コマンドの実行が強制終了され,プログラムの実行に割り込みがかかります。SET ABORT_KEY コマンドを使用して,この強制終了機能を他の Ctrl キー・シーケンスに割り当てることができます。SHOW ABORT_KEY コマンドは強制終了機能として現在有効になっている Ctrl キー・シーケンスを示します。関連コマンド
Ctrl/C
SET ABORT_KEY
DBG> SHOW ABORT_KEY Abort Command Key is CTRL_C DBG> SET ABORT_KEY = CTRL_P DBG> SHOW ABORT_KEY Abort Command Key is CTRL_P DBG> |
この例では,最初の SHOW ABORT_KEY コマンドは省略時の強制終了コマンドのキー・シーケンスである Ctrl/C を示します。SET ABORT_KEY = CTRL_P コマンドは強制終了コマンド機能を Ctrl/P に割り当て,2 番目の SHOW ABORT_KEY コマンドがそれを確認します。
前へ | 次へ | 目次 | 索引 |