Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引



     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   

14.2 画面用プログラムのデバッグ

デバッグ・セッションの間,デバッガは端末の画面を入出力(I/O)のために使用します。1 台の端末を使用して,画面の大部分または全体を使用するような画面用プログラムのデバッグを行う場合,デバッガの入出力はプログラムの入出力に対して上書きしたり上書きされたりします。

1 台の端末をプログラムの入出力とデバッガの入出力のために使用すると,画面モードでデバッグし画面用プログラムが実行時ライブラリ(RTL)画面管理(SMG$)ルーチンのどれかを呼び出している場合はさらに複雑になります。これは,デバッガの画面モードも SMG ルーチンを呼び出すからです。このような場合,デバッガとユーザ・プログラムは同じ SMG ペーストボードを共用し,一層の混乱を引き起こします。

画面用プログラムをデバッグする際のこのような問題を回避するために,デバッガの入出力をプログラムの入出力から分離するために次の方法のいずれかを使用します。

TTD1: が現在の端末であり,そこからデバッグを開始するものとします。デバッガの入出力は端末 TTD2: に表示し,TTD1: はプログラムの入出力専用にするものとします。

次の手順に従ってください。

  1. TTD1: から TTD2 を占有できるよう,TTD2: に必要な保護を設定する(詳細は 第 14.2.1 項 を参照)。

    以降の操作はすべて TTD1: で行う。

  2. TTD2: を占有する。この結果,次のようにユーザの処理は TTD1: で行われ,TDD2: へは排他的アクセスが可能になる。


    $ ALLOCATE TTD2:
    

  3. 次のようにデバッガの論理名 DBG$INPUT および DBG$OUTPUT を TTD2: に割り当てる。


    $ DEFINE DBG$INPUT TTD2:
    $ DEFINE DBG$OUTPUT TTD2:
    


    DBG$INPUT および DBG$OUTPUT は,デバッガの入力装置および出力装置をそれぞれ指定する。省略時には,これらの論理名はそれぞれ SYS$INPUT および SYS$OUTPUT になる。DBG$INPUT および DBG$OUTPUT を TDD2: に割り当てることによって,デバッガ・コマンドおよびデバッガの出力を TDD2: に表示できるようになる。

  4. システムが端末のタイプを認識していることを確認する。次のコマンドを入力する。


    $ SHOW DEVICE/FULL TTD2:
    


    装置タイプが unknown のとき,システム管理者または LOG_IO 特権か PHY_IO 特権を持つユーザは次の例のような方法でシステムに対して端末タイプを認識させる必要がある。この例では,端末を VT200 としている。


    $ SET TERMINAL/PERMANENT/DEVICE=VT200 TTD2:
    

  5. デバッグするプログラムを実行する。


    $  DEBUG/KEEP 
       .
       .
       .
    DBG> RUN prog-name
    


    デバッガの入出力をTTD2:で観察することができる。

  6. デバッグ・セッションを終了したら,TTD2: の占有を解除する。次のように行う。またはログアウトする。


    $ DEALLOCATE TTD2:
    

14.2.1 端末を占有するための保護の設定

適切に保護されているシステムでは,ある端末から別の端末を占有することができないように,端末が保護されています。

必要な保護を設定するために,システム管理者または必要な特権を持つユーザは次の例のような手順に従う必要があります。

この例では,TTD1: が現在の端末(デバッガを起動する端末),TTD2: がデバッガの入出力を表示するために占有する端末です。

  1. TTD1: と TTD2 の両方がシステムに物理的に接続されている場合は,ステップ4に移る。

    TTD1: と TTD2: が LAT(ローカル・エリア・トランスポート)を介してシステムに接続されている場合は,ステップ 2 に進む。

  2. TTD2: にログインする。

  3. 次のコマンドを入力する。LOG_IO 特権または PHY_IO 特権が必要である。


    $ SET PROCESS/PRIV=LOG_IO
    $ SET TERMINAL/NOHANG/PERMANENT
    $ LOGOUT/NOHANG
    

  4. 次のいずれか 1 つのコマンドを入力する。OPER 特権が必要である。


    $ SET ACL/OBJECT_TYPE=DEVICE/ACL=(IDENT=[PROJ,JONES],ACCESS=READ+WRITE)TTD2:   (1)
    $ SET PROTECTION=WORLD:RW/DEVICE TTD2:   (2)
    

    1. SET ACL コマンド行はアクセス制御リスト(ACL)を使用するので,このコマンドを使用するのがよい。この例では,アクセスはユーザ識別コード(UIC)[PROJ,JONES] に制限されている。

    2. SET PROTECTION コマンド行は,ワード読み込み/書き込みアクセスを許可する。したがって,どのユーザも TTD2: を占有し,そこで入出力を実行することが可能になる。

14.3 複数言語プログラムのデバッグ

1 つの同じデバッグ・セッションの中で,ソース・コードが異なる言語で記述されたモジュールをデバッグすることができます。言語固有の動作について,混乱を避けるために注意すべきことを中心に説明します。

どの言語の場合でも,デバッグの際には次を参照してください。

14.3.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 項 を参照してください。


前へ 次へ 目次 索引