日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
たとえば,次のような範囲にウォッチポイントを設定できます。
SET WATCH 30000:300018 |
デバッガは,この範囲をカバーするロングワード・ウォッチ群を設定します。
集合体 ( すなわち,配列全体またはレコード全体 ) にウォッチポイントを設定できます。この場合,配列またはレコードのいずれかの要素が変化すると,配列またはレコードに設定したウォッチポイントが検出されます。このため,個々の配列要素やレコードの構成要素にウォッチポイントを設定する必要はありません。ただし,可変レコードには集合体のウォッチポイントを設定できないことに注意してください。
レコードの構成要素,個々の配列要素,配列断面 ( ある範囲の配列要素 ) にもウォッチポイントを設定できます。この場合,配列断面内のいずれかの要素が変化すればウォッチポイントが検出されます。ウォッチポイントは,現在の言語の構文に従って設定します。
次の修飾子は,ウォッチポイントに達したときにどんな出力を表示するのかを決定します。
/[NO]SILENT
/[NO]SOURCE
次の修飾子は,ウォッチポイントのタイミングと期間を決定します。
/AFTER:n
/TEMPORARY
次の修飾子は非静的変数にだけ指定します。
/INTO
/OVER
次の修飾子は,デバッガによる変数が静的か非静的かの判定を上書きするのに使用します。
/[NO]STATIC
ウォッチポイントの設定方法は変数が静的か非静的かで異なります。
静的変数はプログラムの実行中ずっと同じメモリ・アドレスに関連づけられています。したがって,実行中は静的変数にウォッチポイントをずっと設定しておくことができます。
非静的変数は呼び出しスタックかレジスタに割り当てられ,その定義ルーチンがアクティブである場合だけ値を持ちます ( 呼び出しスタック上に存在します )。このため,定義ルーチン ( 定義ルーチンが呼び出した任意のルーチンを含む ) の有効範囲内で実行が現在中断しているときだけ,非静的変数にウォッチポイントを設定できます。定義ルーチンから制御が戻ると,ウォッチポイントは取り消されます。非静的変数を使用した場合,デバッガは,すべての命令をトレースしてウォッチされた変数または位置に変更があるかどうかを検出します。
静的ウォッチポイントと非静的ウォッチポイントは実行速度も異なります。静的変数をウォッチする場合,デバッガはその変数を含むページを書き込み保護にします。プログラムがそのページに書き込もうとすると,アクセス違反が発生しデバッガが例外を処理し,ウォッチしている変数の内容が変更されたかどうかを調べます。そのページへの書き込みが発生しないかぎりプログラムは通常の速度で実行します。
非静的変数をウォッチするには,変数の定義ルーチン内の各命令をトレースし,各命令実行後に変数の値を調べます。このため,実行が極めて遅くなるので,非静的ウォッチポイントを設定すると,メッセージが発行されます。
次に説明するように,/[NO]STATIC,/INTO,/OVER を使用すれば,変数をウォッチするときに実行速度やその他の要因をある程度制御できます。
デバッガは,変数の割り当てを調べて,静的か非静的かを判断します。通常,静的変数は P0 空間 (0 から 3FFFFFFF,16 進数 ) に,非静的変数は P1 空間 (40000000 から 7FFFFFFF) またはレジスタに割り当てられます。定義ルーチンの有効範囲内で現在実行が中断していないときに,P1 空間またはレジスタに割り当てられた変数にウォッチポイントを設定しようとすると,デバッガは警告を出力します。
/[NO]STATIC 修飾子を指定すると,この省略時の動作を上書きできます。たとえば,P1 空間に非スタック記憶を割り当てた場合,その記憶領域に割り当てられた変数にウォッチポイントを設定するときには /STATIC を使用します。こうすれば,デバッガは各命令をトレースする代わりにもっと高速の書き込み保護による記憶位置のウォッチ方法を使用できます。たとえば,逆に P0 空間にユーザの呼び出しスタックを割り当てた場合,呼び出しスタックに割り当てられた変数にウォッチポイントを設定するときには,/NOSTATIC を使用します。こうすれば,デバッガはウォッチポイントを非静的ウォッチポイントとして扱うことができます。
/INTO および /OVER を使用すれば,呼び出されたルーチン内の非静的ウォッチポイントの実行速度も制御できます。
Alpha では,静的ウォッチポイントと非静的ウォッチポイントの両方が使用できます。静的ウォッチポイントを使用した場合,デバッガは,ウォッチする変数が保存されているメモリのページを書き込み保護します。このため,デバッガのシステム・サービス割り込み (SSI) のためでなければ,静的ウォッチポイントは,システム・サービス自体とインタフェースをとります。
静的ウォッチポイントが有効な場合,システム・サービス割り込みを通して,システム・サービス呼び出しの前にデバッガは,静的ウォッチポイント,非同期トラップ (AST),およびスレッド・スイッチを非アクティブにします。デバッガは,システム・サービス呼び出しが完了するとすぐに,ウォッチポイント,使用可能なAST,スレッド・スイッチを元の状態に戻し,最後にウォッチポイントのヒットをチェックします。この動作は,ウォッチポイントが非アクティブにされても,システム・サービスが通常どおりに動作し ( 書き込み保護のページなし ), AST コードまたは異なるスレッドが,ウォッチポイントする位置に変更の可能性がないように設計されています。お使いのアプリケーションで AST が使用可能かどうかをテストする場合などは,この動作に気をつけてください。
システム・サービスが system service interception (SSI) 機能 (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 および Integrity のみ)
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..." メッセージとソース・コードは表示されません。
#7 |
---|
DBG> GO %DEBUG-I-ASYNCSSWAT, possible asynchronous system service and static watchpoint collision break at LARGE_UNION\main\%LINE 24192+60 DBG> SHOW CALL module name routine name line rel PC abs PC *LARGE_UNION main 24192 00000000000003A0 00000000000303A0 *LARGE_UNION __main 24155 0000000000000110 0000000000030110 FFFFFFFF80B90630 FFFFFFFF80B90630 DBG> EX/SOURCE %line 24192 module LARGE_UNION 24192: sstatus = sys$getsyi (EFN$C_ENF, &sysid, 0, &syi_ile, &myiosb, 0, 0); |
この例では, IOSB が直接ウォッチされた場合,あるいは単にアクティブな静的ウォッチポイントと同じページに存在する場合であっても SYS$QIO による IOSB 出力パラメータへの非同期書き込みが失敗します。
デバッガはこの問題を検出し,静的ウォッチポイントと非同期システムサービス間の潜在的な不一致をユーザに知らせます。
デバッガで HELP MESSAGE ASYNCSSWAT と入力すると,この状態が検出された場合に取るアクションについて参照することができます。
SET WINDOW |
画面ウィンドウ定義を作成します。
注意
このコマンドは,デバッガへの HP 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) に定義されます。
SHOW ABORT_KEY |
デバッガ・コマンドの実行を強制終了するか,またはプログラムの実行に割り込みをかける機能として現在定義されている Ctrl キー・シーケンスを示します。
注意
このコマンドは,デバッガへの HP 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 コマンドがそれを確認します。
目次 | 索引 |
|