[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

6 ソース・コードの表示の制御

ソース・コードとは,ソース・ファイル内に現れるプログラミング言語の文を指します。 ソース・コードの各行はソース行と呼ばれます。

本章には次の内容が含まれています。

本章で説明する方法は,行(非画面)モードだけでなく画面モードにも適用できます。 行モードと画面モードの動作内容の相違点は,本章と各コマンドの説明の中で示します。 画面モードについての詳細な説明は,第7章を参照してください。

プログラムがコンパイラによって最適化されている場合は,デバッグ時に実行されるコードがソース・ コードに一致しないこともあります。詳しい説明は, 第14.1節を参照してください。

6.1 デバッガがソース・コード情報を取得する方法

コンパイラは,オブジェクト・モジュールを生成するためにソース・ファイルを処理する場合, 各ソース行に順に行番号を割り当てます。ほとんどの言語の場合, 各コンパイル単位(モジュール)は行1から始まります。Ada などでは各ソース・ファイルが行1から始まり,1つのソース・ファイルが複数のコンパイル単位を表す場合もあります。

行番号は/LISTコンパイル・コマンド修飾子を使用して取得したソース・ リスト内に表示されます。また,デバッガがソース・コードを表示する際に, 行モードと画面モードのどちらの場合でも常に行番号が表示されます。 さらに,いくつかのデバッガ・コマンド(たとえば,TYPEおよびSET BREAK)で行番号を指定することができます。

コンパイル・コマンドとLINKコマンドの両方に/DEBUGコマンドを指定した場合にだけ, デバッグ時にソース行は表示されます。そのような条件下では, コンパイラによって作成されてデバッグ・シンボル・テーブル(DST) に渡されたシンボル情報には,ソース行コリレーション・レコードが含まれます。 ある特定のモジュールでは,ソース行コリレーション・レコードには, そのモジュールを支える各ソース・ファイルの完全なファイル指定が入っています。 また,ソース行コリレーション・レコードはソース・レコード( シンボルや型など)をモジュール内のソース・ファイルと行番号に対応づけます。

6.2 ソース・ファイルの記憶位置の指定

デバッグ・シンボル・テーブル(DST)には,各ソース・ファイルのコンパイル時における完全なファイル指定が入っています。 したがって,省略時の設定では, デバッガはソース・ファイルがコンパイル時と同じディレクトリの中に入っているものと想定します。 ソース・ファイルをコンパイル後に別のディレクトリに移動した場合, デバッガはそれを見つけることができず, そのファイルからソース・コードを表示しようとすると次のような警告を表示します。

     %DEBUG-W-UNAOPNSRC, unable to open source file DISK:[JONES.WORK]PRG.FOR;2

このような場合,デバッガに新しいディレクトリを指示するため,SET SOURCEコマンドを使用します。このコマンドは,そのプログラム用のすべてのソース・ ファイルに対して適用したり,特定のモジュール用のソース・ ファイルだけに適用したりできます。

たとえば,次のコマンド行を入力すると,デバッガはWORK$:[JONES.PROG3]: の中からすべてのソース・ファイルを探します。

     DBG> SET SOURCE WORK$:[JONES.PROG3]

ディレクトリ検索リストをSET SOURCEコマンドで指定できます。たとえば, 次のコマンド行を入力すると,デバッガはまず現在の省略時ディレクトリ([]) からファイルを探し,次にWORK$:[JONES.PROG3]:を探します。

     DBG> SET SOURCE [], WORK$:[JONES.PROG3]

ある特定のモジュール用のソース・ファイルだけにSET SOURCEコマンドを適用したい場合は,/MODULE= module-name修飾子を使用してそのモジュールを指定します。 たとえば,次のコマンド行は,モジュールSCREEN_IO 用のソース・ファイルがディレクトリDISK2:[SMITH.SHARE]に入っていることを指定します。 他のモジュール用のソース・ファイルの検索は, このコマンドによって影響を受けません。

     DBG> SET SOURCE/MODULE=SCREEN_IO DISK2:[SMITH.SHARE]

つまり,SET SOURCE/MODULEコマンドは特定のモジュール用のソース・ファイルの記憶位置を指定し,SET SOURCE コマンドはSET SOURCE/MODULEコマンド内で明示的に指定されなかったモジュール用のソース・ ファイルの記憶位置を指定します。

SET SOURCEコマンドを入力する場合,/LATESTか/EXACTの修飾子が常に有効であることを確認してください。/LATEST は,最新バージョン(ディレクトリ内にある最大番号のバージョン) のソース・ファイルを検索するようデバッガに指示します。/EXACT 修飾子は,最後にコンパイルしたバージョン( コンパイル時に作成されたデバッガ・シンボル・テーブルに記録されているバージョン) を検索するようデバッガに指示します。たとえば, SET SOURCE/LATESTコマンドはSORT.FOR;3を検索し,SET SOURCE/EXACTはSORT.FOR;1 を検索するという具合です。

SHOW SOURCEコマンドは,現在有効なすべてのソース・ディレクトリ検索リストを表示するために使用します。 このコマンドは1つまたは複数のSET SOURCE/MODULEコマンドで前に設定したとおりの特定のモジュール用の検索リストを表示し,SET SOURCE コマンドで前に設定したとおりの他のすべてのモジュール用の検索リストを表示します。 次に例を示します。

     DBG> SET SOURCE [PROJA],[PROJB],USER$:[PETER.PROJC]
     DBG> SET SOURCE/MODULE=COBOLTEST [], DISK$2:[PROJD]
     DBG> SHOW SOURCE
     source directory search list for COBOLTEST:
             []
             DISK$2:[PROJD]
     source directory search list for all other modules:
             [PROJA]
             [PROJB]
             USER$:[PETER.PROJC]
     DBG>

SET SOURCEコマンドもSET SOURCE/MODULEコマンドも入力しなかった場合,SHOW SOURCE コマンドは現在有効な検索リストがないことを示します。

前のSET SOURCEコマンドの効力を取り消すには,CANCEL SOURCEコマンドを使用します。 前のSET SOURCE/MODULEコマンドの効力を取り消すには, CANCEL SOURCE/MODULEコマンドを同じモジュール名を指定して使用します。

ソース・ディレクトリ検索リストを取り消した場合,デバッガは再び,指定されたモジュールに対応するソース・ ファイルがコンパイル時と同じディレクトリに入っているものと想定します。

コンパイル後に別のディレクトリに移されたソース・ファイルをデバッガが検索する方法についての詳しい説明は,SET SOURCE コマンドの説明を参照してください。

6.3 行番号の指定によるソース・コードの表示

TYPEコマンドを使用すると,コンパイラ割り当て行番号を指定することによってソース行を表示できます。 その場合,それぞれの行番号はソース・ コードの1行を指定します。

たとえば,次のコマンドはデバッグ中のモジュールの行160と行22〜24を表示します。

     DBG> TYPE 160, 22:24
     module COBOLTEST
        160: START-IT-PARA.
     module COBOLTEST
         22: 02      SC2V2   PIC S99V99      COMP VALUE  22.33.
         23: 02      SC2V2N  PIC S99V99      COMP VALUE -22.33.
         24: 02      CPP2    PIC PP99        COMP VALUE  0.0012.
     DBG>

あるモジュールのすべてのソース行を表示するには,1から始めてそのモジュール内の最大の行番号またはそれ以上の数で終わる行番号の範囲を指定します。

ソース行の表示後は,行番号なしのTYPEコマンドを入力すれば,つまりTYPE コマンドを入力してからReturnキーを押せば,そのモジュール内の次の行を表示できます。 次に例を示します。

     DBG> TYPE 160
     module COBOLTEST
        160: START-IT-PARA.
     DBG> TYPE
     module COBOLTEST
        161:         MOVE SC1 TO ES0.
     DBG>

その後,繰り返しTYPEコマンドを入力することによって,その次の行とそれ以降の行を表示できます。 このようにして,一度に1行ずつコードを参照することができます。

プログラム内の任意のモジュールのソース行を表示するには,行番号といっしょにモジュール名を指定します。 パス名の表記法は標準のものを使用します。 つまり,最初にモジュール名を指定し,次にバックスラッシュ(\) ,最後に行番号または行番号の範囲を指定しますが,それらの間にスペースは入れません。 たとえば,次のコマンドはTESTというモジュールの行16 を表示します。

     DBG> TYPE TEST\16

TYPEコマンドでモジュール名を指定する場合,そのモジュールは設定されていなければなりません。 特定のモジュールが設定されているかどうかを判別するには,SHOW MODULE コマンドを使用します。その後,必要であればSET MODULE コマンドを使用してください( 第5.2 節を参照)。

TYPEコマンドでモジュール名を指定しなかった場合,デバッガは省略時の設定では現在実行が一時停止されているモジュール, つまり,PC範囲に対応したモジュールのソース行を表示します。SET SCOPE コマンドで別の有効範囲を指定してある場合は, デバッガは指定された有効範囲に対応するモジュールのソース行を表示します。

画面モードでは,TYPEコマンドの出力は現在のソースの表示を更新します( 第7.2.6項を参照)。

プログラム内のさまざまな記憶位置のソース行を表示したあと,KP5を押すと, 現在実行が一時停止されている行を再表示することができます。

6.4 コード・アドレス式の指定によるソース・ コードの表示

EXAMINE/SOURCEコマンドを使用すると,コード・アドレス式に対応したソース行を表示できます。 コード・アドレス式は機械語コード命令のアドレスを表すものなので, 次のいずれかでなければなりません。

EXAMINE/SOURCEコマンドに変数名を指定することはできません。変数名は, 命令ではなくデータに対応しているからです。

EXAMINE/SOURCEコマンドを使用した場合,デバッガはメモリ・アドレスを取得するためにアドレス式を評価し, どのコンパイラ割り当て行番号がそのアドレスに対応するかを判別してから, その行番号によって指定されるソース行を表示します。

たとえば,次のコマンド行はルーチンSWAPのアドレス(宣言)に対応したソース行を表示します。

     DBG> EXAMINE/SOURCE SWAP
     module MAIN
         47:  procedure SWAP(X,Y: in out INTEGER) is
     DBG>

命令に対応しない行番号を指定した場合,デバッガは診断メッセージを発行します。 次に例を示します。

     DBG> EXAMINE/SOURCE %LINE 6
     %DEBUG-I-LINEINFO, no line 6, previous line is 5, next line is 8
     %DEBUG-E-NOSYMBOL, symbol '%LINE 6' is not in the symbol table
     DBG>

EXAMINE/SOURCEコマンドをシンボリック・アドレス式(行番号,ラベル, またはルーチン)といっしょに使用する際,その要素を定義しているモジュールがまだ設定されていないときには, それを設定しなければならない場合もあります。 特定のモジュールが設定されているかどうかを判別するには,SHOW MODULE コマンドを使用します。その後,必要であればSET MODULEコマンドを使用します(第5.2節を参照) 。

EXAMINE/SOURCE .%PCコマンドは,現在のPC値(実行されようとしている行) に対応するソース行を表示します。次に例を示します。

     DBG> EXAMINE/SOURCE .%PC
     module COBOLTEST
        162:         DISPLAY ES0.
     DBG>

内容演算子(.)の使用に注意してください。この演算子は,このピリオドの後ろにある要素の内容を指定します。 内容演算子を使用しなかった場合, デバッガはPC内に現在格納されているアドレスではなく,PCのソース行を見つけようとします。

     DBG> EXAMINE/SOURCE %PC
     %DEBUG-W-NOSRCLIN, no source line for address 7FFF005C
     DBG>

次の例は,数値パス名(1\)を使用して呼び出しスタックの1レベル下のPC 値にある実行が一時停止されているルーチンの呼び出しのソース行を表示する例です。

     DBG> EXAMINE/SOURCE .1\%PC

画面モードでは,EXAMINE/SOURCEコマンドの出力は現在のソースの表示を更新します( 第7.2.6項を参照)。

デバッガは,次のコンテキストでEXAMINE/SOURCEコマンドを使用して現在のPC 値のソース・コードを表示します。

キーパッド・キー5(KP5)が次のような一連のデバッガ・コマンドにバインドされています。

     EXAMINE/SOURCE .%SOURCE_SCOPE\%PC; EXAMINE/INST .%INST_SCOPE\%PC

この一連のコマンドは,現在の有効範囲内で現在実行が一時停止されている位置のソース行と命令を表示します。KP5 を押せばデバッグ・コンテキストを素早く判別することができます。

定義済みソース・ディスプレイ「SRC」は自動的に更新される表示です。 これは,デバッガが実行に割り込みをかけ,コマンドを求めるプロンプトを表示するたびに, 次の組み込みコマンドを実行します( 第7.4.1項を参照)。

     EXAMINE/SOURCE .%SOURCE_SCOPE\%PC

6.5 文字列の検索によるソース・コードの表示

SEARCHコマンドを使用すると,指定した文字列を含んでいるソース行を表示できます。

SEARCHコマンドの構文は次のとおりです。

     SEARCH[/qualifier[,  . . .]] [range] [string]

範囲のパラメータには,モジュール名,行番号の範囲,またはそれらの組み合わせが指定できます。 モジュール名を指定しなかった場合,デバッガはTYPE コマンドの場合と同様に現在の有効範囲を使用してソース行を見つけます( 第6.3節を参照)。

省略時の設定では,SEARCHコマンドは指定された範囲内でその文字列が最初に( 次に)現れるソース行を表示します(SEARCH/NEXT)。SEARCH/ALLコマンドは, 指定された範囲内でその文字列が現れるすべてのソース行を表示します。 たとえば,次のコマンド行はモジュールSCREEN_IO内でproという文字列が最初に現れるソース行を表示します。

     DBG> SEARCH SCREEN_IO pro

以下の例では,1つのCOBOLモジュールに入っているソース行を使用して, 現在の有効範囲内でSEARCHコマンドのさまざまな側面を示しています。

次のコマンド行は,文字列Dを含んでいるすべてのソース行を行40〜50から抽出して表示します。

     DBG> SEARCH/ALL 40:50 D
     module COBOLTEST
         40: 02      D2N     COMP-2 VALUE -234560000000.
         41: 02      D       COMP-2 VALUE  222222.33.
         42: 02      DN      COMP-2 VALUE -222222.333333.
         47: 02      DR0     COMP-2 VALUE  0.1.
         48: 02      DR5     COMP-2 VALUE  0.000001.
         49: 02      DR10    COMP-2 VALUE  0.00000000001.
         50: 02      DR15    COMP-2 VALUE  0.0000000000000001.
     DBG>

特定のモジュール内で文字列の発生箇所を見つけたあと,パラメータを付けずにSEARCH コマンドを入力すれば,同じモジュール内で同じ文字列が次に現れるソース行を表示することができます。 これは,パラメータを付けずにTYPE コマンドを使用して次のソース行を表示するのと似ています。次に例を示します。

     DBG> SEARCH 42:50 D
     module COBOLTEST
         42: 02      DN      COMP-2 VALUE -222222.333333.
     DBG> SEARCH
     module COBOLTEST
         47: 02      DR0     COMP-2 VALUE  0.1.
     DBG>

省略時の設定では,デバッガは指定されたとおりの文字列を検索し,その文字列の前後のコンテキストは解釈しません。 これがSEARCH/STRINGの動作内容です。 ある文字列がプログラム内で識別子(たとえば,変数名)として使用されている箇所を検索し, 識別子以外の箇所を除外したい場合は,/IDENTIFIER 修飾子を使用します。SEARCH/IDENTIFIERコマンドは,その文字列の両端が現在の言語で識別子の一部とはならない文字によって区切られている場合にだけその文字列を表示します。

SEARCHコマンドの省略時の修飾子は/NEXTと/STRINGです。別の省略時の修飾子を設定したい場合はSET SEARCH コマンドを使用します。たとえば,次のコマンドの実行後は,SEARCH コマンドはSEARCH/IDENTIFIERのように動作します。

     DBG> SET SEARCH IDENTIFIER

現在SEARCHコマンドに有効な省略時の修飾子を表示するには,SHOW SEARCHコマンドを使用します。次に例を示します。

     DBG> SHOW SEARCH
     search settings: search for next occurrence, as an identifier
     DBG>

6.6 ステップ実行後,およびイベントポイントでのソースの表示の制御

省略時の設定では,対応するソース行をデバッガが表示するのは,ブレークポイント, トレースポイント,ウォッチポイントの検出後,または1つのSTEP コマンドが完了したときです。

STEPコマンドを入力した場合,デバッガはステップ実行後に実行が一時停止した位置のソース行を表示します。 次に例を示します。

     DBG> STEP
     stepped to MAIN\%LINE 16
         16:        RANGE := 500;
     DBG>

ブレークポイントまたはトレースポイントが検出された場合,デバッガはそのブレークポイントまたはトレースポイントの位置のソース行を表示します。 次に例を示します。

     DBG> SET BREAK SWAP
     DBG> GO
        .
        .
        .
     break at MAIN\SWAP
         47: procedure SWAP(X,Y: in out INTEGER) is
     DBG>

ウォッチポイントが検出された場合,デバッガはそのウォッチポイントが検出される原因となった命令に対応するソース行を表示します。

SET STEP [NO]SOURCEコマンドを使用すると,1ステップの実行後のソース・ コードの表示,またはブレークポイント,トレースポイント,ウォッチポイントでのソース・ コードの表示を制御することができます。SET STEP SOURCE(省略時の設定)はソースの表示を有効にします。SET STEP NOSOURCEはソースの表示を無効にします。次に例を示します。

     DBG> SET STEP NOSOURCE
     DBG> STEP
     stepped to MAIN\%LINE 16
     DBG> SET BREAK SWAP
     DBG> GO
        .
        .
        .
     break at MAIN\SWAP
     DBG>

SET STEP SOURCEコマンドまたはSET STEP NOSOURCEコマンドの効力を選択的に上書きするには,STEP, SET BREAK, SET TRACE ,およびSET WATCHの各コマンドに/SOURCE および/NOSOURCEの修飾子を使用します。

STEP/SOURCEコマンドはSET STEP NOSOURCEコマンドの効力を上書きしますが, それはそのSTEPコマンドが実行される間だけです。同様に,STEP /NOSOURCEもSET STEP SOURCEの効力をそのSTEPコマンドが実行される間だけ上書きします。 次に例を示します。

     DBG> SET STEP NOSOURCE
     DBG> STEP/SOURCE
     stepped to MAIN\%LINE 16
         16:        RANGE := 500;
     DBG>

SET BREAK/SOURCEコマンドはSET STEP NOSOURCEコマンドの効力を上書きしますが, それはそのSET BREAKコマンドによって設定されたブレークポイントに対してだけです。 同様に,SET BREAK/NOSOURCEもSET STEP SOURCEの効力をそのSET BREAKコマンドによって設定されたブレークポイントに対してだけ上書きします。 この規則はSET TRACEとSET WATCHにも適用されます。 次に例を示します。

     DBG> SET STEP SOURCE
     DBG> SET BREAK/NOSOURCE SWAP
     DBG> GO
        .
        .
        .
     break at MAIN\SWAP
     DBG>

6.7 ソースの表示用のマージンの設定

SET MARGINSコマンドを使用すると,ソース行の表示を開始し終了する左端と右端のソース行文字位置( 左マージンと右マージン)が指定できます。 これは,たとえばコードが深くインデントされていたり,長い行が右マージンで折り返したりする場合に, ソース・コードの表示を制御するのに役立ちます。 このような場合には,インデントされたスペースをソースの表示で削除するために左マージンを設定したり, 行を切り捨てて折り返しを防ぐために右マージンを減らしたりできます。

たとえば,次のコマンド行は左マージンを桁25,右マージンを桁35に設定します。

     DBG> SET MARGINS 20:35

このあとでソース行を表示するコマンド(たとえば,TYPE, SEARCH, STEP) を入力すると,ソース・コードの桁20と桁35の間の部分だけが表示されます。 ソース行表示の現在のマージン設定を示すには,SHOW MARGINSコマンドを使用します。

SET MARGINSコマンドはソース行の表示だけにしか影響を及ぼさないので注意してください。 このコマンドは,その他のデバッガ出力(たとえばEXAMINE コマンドによる出力など)の表示には影響しません。

ほとんどの場合,SET MARGINSコマンドは行(非画面)モードで役立ちます。 画面モードでは,SET MARGINSコマンドは定義済みディスプレイ「SRC 」などのソースの表示におけるソース行の表示には効力を持ちません。


[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]