前へ | 次へ | 目次 | 索引 |
DBG> step stepped to DOCT8\doct8\%LINE 390 390: j = 2; |
ここで j の値が表示されます。
DBG> examine j %W, entity 'j' does not have a value at the current PC DBG> step stepped to DOCT8\doct8\%LINE 393 393: if(foo(i)){ DBG> examine j DOCT8\doct8\j: 2 value defined at DOCT8\doct8\%LINE 390 |
400行目のprint文までスキップし,j の値をテストします。
DBG> set break %line 400 DBG> g break at DOCT8\doct8\%LINE 400 400: printf("%d, %d, %d\n", i, j, k); DBG> examine j DOCT8\doct8\j: 2 value defined at DOCT8\doct8\%LINE 390 value defined at DOCT8\doct8\%LINE 394 |
j の値を定義した位置が複数あります。IF 節で選択されるパスにより,どちらかの位置が適用されます。この機能を使用すれば,変数が明らかに不適切な値の場合,その場所を調べることができ,同時に値がどこから来ているのかについても調べることができます。
次の例のようにSHOW SYMBOL/ADDRESSコマンドを使用すると,あるシンボルの存在期間分割情報を表示することができます。
DBG> show symbol/address j data DOCT8\doct8\j between PC 131128 and 131140 PC definition locations are at: 131124 address: %R3 between PC 131144 and 131148 PC definition locations are at: 131140 address: %R3 between PC 131152 and 131156 PC definition locations are at: 131124 address: %R3 between PC 131160 and 131208 PC definition locations are at: 131124, 131140 address: %R3 |
変数 j には,4つの存在期間セグメントがあります。PCアドレスは,イメージのリンク結果を示し,同時にソース・プログラムの行番号との対応が,コメントにより示されます。
OpenVMS AlphaシステムとOpenVMS VAXシステムとではサポートする存在期間分割に,概念上大きな違いがあります。Alpha システムの場合,デバッガは,どの割り当てとどの定義が変数の表示値を規定するかについて,トラックして報告します。この補足情報を使用することにより,コードのモーションなどの最適化の効果のうちいくつかを処理できるようになります。変数値がプログラムの予期しない場所から来ているような場合も,その効果を処理できるようになります。
◆EXAMINE/DEFINITIONSコマンド(Alpha のみ)
存在期間分割変数の場合,EXAMINEコマンドは,アクティブな存在期間の値を表示するだけでなく,存在期間の定義位置も表示します。定義位置とは,存在期間が初期値を受け取る場所を表します。定義位置が1つの場合,それが唯一の位置になります。
存在期間の初期値が複数の位置から来ている場合,定義位置も複数になります。前の例では,プログラムが printf, で停止したときに j をテストすると次のようになります。
DBG> examine j DOCT8\doct8\j: 2 value defined at DOCT8\doct8\%LINE 390 value defined at DOCT8\doct8\%LINE 394 |
この場合,393 行目の式が TURE かどうかにより,値が 390 行目と 394 行目のどちらから来るか決まるため,j の存在期間には,2つの定義位置があることになります。
省略時の場合,変数の内容がテストされるときに最大で5つの定義位置が表示されます。定義位置の数を指定するときは,次の例のように/DEFINITIONS= n修飾子を使用します。
DBG> EXAMINE/DEFINITIONS=74 FOO |
省略形は/DEFIになります。
省略時の定義数を5以外の数にしたい場合,次のようなコマンド定義を使用します。
DBG> DEFINE/COMMAND E = "EXAMINE/DEFINITIONS=100" |
/DEFINITIONS修飾子に100が設定されていて,テストしている存在期間分割変数に120の定義位置がある場合,デバッガは,指定に従って100個表示しますが,同時に次のようなレポートも表示します。
there are 20 more definition points |
デバッグ・セッションの間,デバッガは端末の画面を入出力(I/O)のために使用します。1 台の端末を使用して,画面の大部分または全体を使用するような画面用プログラムのデバッグを行う場合,デバッガの入出力はプログラムの入出力に対して上書きしたり上書きされたりします。
1 台の端末をプログラムの入出力とデバッガの入出力のために使用すると,画面モードでデバッグし画面用プログラムが実行時ライブラリ(RTL)画面管理(SMG$)ルーチンのどれかを呼び出している場合はさらに複雑になります。これは,デバッガの画面モードも SMG ルーチンを呼び出すからです。このような場合,デバッガとユーザ・プログラムは同じ SMG ペーストボードを共用し,一層の混乱を引き起こします。
画面用プログラムをデバッグする際のこのような問題を回避するために,デバッガの入出力をプログラムの入出力から分離するために次の方法のいずれかを使用します。
TTD1: が現在の端末であり,そこからデバッグを開始するものとします。デバッガの入出力は端末 TTD2: に表示し,TTD1: はプログラムの入出力専用にするものとします。
次の手順に従ってください。
以降の操作はすべて TTD1: で行う。
$ ALLOCATE TTD2: |
$ DEFINE DBG$INPUT TTD2: $ DEFINE DBG$OUTPUT TTD2: |
DBG$INPUT および DBG$OUTPUT は,デバッガの入力装置および出力装置をそれぞれ指定する。省略時には,これらの論理名はそれぞれ SYS$INPUT および SYS$OUTPUT になる。DBG$INPUT および DBG$OUTPUT を TDD2: に割り当てることによって,デバッガ・コマンドおよびデバッガの出力を TDD2: に表示できるようになる。
$ SHOW DEVICE/FULL TTD2: |
装置タイプが unknown のとき,システム管理者または LOG_IO 特権か PHY_IO 特権を持つユーザは次の例のような方法でシステムに対して端末タイプを認識させる必要がある。この例では,端末を VT200 としている。
$ SET TERMINAL/PERMANENT/DEVICE=VT200 TTD2: |
$ DEBUG/KEEP . . . DBG> RUN prog-name |
デバッガの入出力をTTD2:で観察することができる。
$ DEALLOCATE TTD2: |
適切に保護されているシステムでは,ある端末から別の端末を占有することができないように,端末が保護されています。
必要な保護を設定するために,システム管理者または必要な特権を持つユーザは次の例のような手順に従う必要があります。
この例では,TTD1: が現在の端末(デバッガを起動する端末),TTD2: がデバッガの入出力を表示するために占有する端末です。
TTD1: と TTD2: が LAT(ローカル・エリア・トランスポート)を介してシステムに接続されている場合は,ステップ 2 に進む。
$ SET PROCESS/PRIV=LOG_IO $ SET TERMINAL/NOHANG/PERMANENT $ LOGOUT/NOHANG |
$ SET ACL/OBJECT_TYPE=DEVICE/ACL=(IDENT=[PROJ,JONES],ACCESS=READ+WRITE)TTD2: (1) $ SET PROTECTION=WORLD:RW/DEVICE TTD2: (2) |
1 つの同じデバッグ・セッションの中で,ソース・コードが異なる言語で記述されたモジュールをデバッグすることができます。言語固有の動作について,混乱を避けるために注意すべきことを中心に説明します。
どの言語の場合でも,デバッグの際には次を参照してください。
プログラムをデバッガの制御下に置くとき,デバッガは 現在の言語 をメイン・プログラムが含まれているモジュール(通常は,イメージ遷移アドレスを含んでいるルーチン)を記述している言語に設定します。現在の言語は,その時点で識別されます。次に例を示します。
$ DEBUG/KEEP Debugger Banner and Version Number DBG> RUN prog-name Language: PASCAL, Module: FORMS DBG> |
現在の言語の設定は,デバッガ・コマンドで指定した名前,演算子,式をデバッガがどう解析し,解釈するかを決定します。変数の型の設定,配列やレコードの構文,整数データの省略時の基数,大文字/小文字の区別などの解釈も含まれます。言語の設定によって,ユーザ・プログラムに関連するデータの表示方法も決まります。
多くのプログラムでは,メイン・プログラムの言語とは別の言語で記述されたモジュールが含まれています。混乱をできるだけ少なくするために,省略時の設定ではデバッガの言語は,別の言語で記述されたモジュールの中で実行が一時停止しても,デバッグ・セッションを通してメイン・プログラムの言語に設定されたまま変わりません。
このようなモジュールでのシンボリック・デバッグの利点を最大に活用するためには,SET LANGUAGE コマンドを使用してデバッグ・コンテキストを別の言語のデバッグ・コンテキストに設定します。たとえば次のコマンドは,デバッガがシンボルや式などを COBOL 言語の規則に従って解釈するように設定します。
DBG> SET LANGUAGE COBOL |
VAX プロセッサでは,SET LANGUAGE コマンドは次のキーワードを受け付けます。
ADA | BASIC | BLISS | C |
C_PLUS_PLUS | COBOL | DIBOL | FORTRAN |
MACRO | PASCAL | PLI | RPG |
SCAN | UNKNOWN |
Alpha プロセッサでは,SET LANGUAGE コマンドは次のキーワードを受け付けます。
ADA | AMACRO | BASIC | BLISS |
C | C_PLUS_PLUS | COBOL | FORTRAN |
MACRO | MACRO64 | PASCAL | PLI |
UNKNOWN |
さらに,サポートされていない言語で記述されたプログラムをデバッグする場合,SET LANGUAGE UNKNOWN コマンドを指定することができます。サポートされていない言語でもデバッガを最大限活用できるようにするために,SET LANGUAGE UNKNOWN コマンドはデバッガがデータ形式と演算子の組み合わせを広く受け付けるようにします。これらの中には,サポートされている言語の少数にだけ固有のものも含まれます。言語が UNKNOWN に設定された場合に認識される演算子や構造については,デバッガのオンライン・ヘルプに示します(HELP Language と入力します)。
14.3.2 言語に固有の相違点
ここでは,各言語でデバッグを行う場合に注意すべき相違点を説明します。SET LANGUAGE コマンドの影響を受ける相違点およびその他の相違点,たとえば,言語固有の初期化コードや定義済みのブレークポイントなどが挙げられています。
ここに挙げられているものはすべてではありません。詳細については,デバッガのオンライン・ヘルプ(HELP Language と入力する)および使用している言語のドキュメントを参照してください。
14.3.2.1 省略時の基数
整数データを入力したり表示したりするための省略時の基数は,ほとんどの言語では 10 進数です。
VAX プロセッサでは,BLISS および MACRO の場合は例外であり,これらは 16 進数を省略時の基数とします。
Alpha プロセッサでは,BLISS, MACRO--32 および MACRO--64 の場合は例外であり,これらは 16 進数を省略時の基数とします。
新しい省略時の基数を設定するには,SET RADIX コマンドを使用します。
14.3.2.2 言語式の評価
いくつかのデバッガ・コマンドや構造は言語式を評価します。
これらのコマンドを処理するとき,第 4.1.6 項 で説明されているように,デバッガは現在の言語の構文および現在の基数に基づいて言語式を評価します。デバッガは,(コマンドを入力するときではなく)実行のたびに,WHEN 節や DO 節の式の構文をチェックし,その後これらを評価します。
演算子は言語によって大きく異なりますので注意してください。たとえば,次の 2 つのコマンドはそれぞれ Pascal および Fortran で記述された同じ意味の式を評価しています。
DBG> SET WATCH X WHEN(Y < 5) ! Pascal DBG> SET WATCH X WHEN(Y .LT. 5) ! FORTRAN |
言語が PASCAL に設定されていて,最初の Pascal のコマンドを入力したとします。ここで Fortran のルーチン内の命令をステップ実行して言語を Fortran に設定し,処理を再開します。言語が Fortran に設定されている間,デバッガは式(Y < 5)を評価することができません。その結果,無条件のウォッチポイントを設定します。ウォッチポイントが検出されると,< 演算子に対する構文エラーが返されます。
このような矛盾は,デバッガ・コマンド・プロシージャやデバッガ初期化ファイル内で言語式を評価するコマンドを実行する場合にも発生します。
言語が BLISS に設定された場合,デバッガは変数名または他のアドレス式を含む言語式を別の言語が設定された場合とは異なるように処理します。詳細については 第 4.1.6 項 を参照してください。
前へ | 次へ | 目次 | 索引 |