前へ | 次へ | 目次 | 索引 |
SET TYPE/OVERRIDE コマンドを使用すれば,任意のプログラム記憶位置に対応した型を上書きでき,その結果どのようなコンパイラ生成型でも変更できます。たとえば,次のコマンドの実行後に EXAMINE コマンドを無修飾で実行した場合,指定した記憶位置の最初のバイトの内容だけが表示され,その内容はバイト整数データとして解釈されます。無修飾の DEPOSIT コマンドを実行した場合は,指定した記憶位置の最初のバイトだけが変更され,格納するデータはバイト整数データとして編集されます。
DBG> SET TYPE/OVERRIDE BYTE |
SET TYPE/OVERRIDE コマンドに対して指定できる型キーワードについては,表 4-3 を参照してください。
現在の上書き型を表示するには,SHOW TYPE/OVERRIDE コマンドを入力します。現在の上書き型を取り消して,シンボリック名を持つ記憶位置の通常の解釈へ戻すには,CANCEL TYPE/OVERRIDE コマンドを入力します。
EXAMINE コマンドと DEPOSIT コマンドには,EXAMINE コマンドまたは DEPOSIT コマンドの実行中に,プログラムの記憶位置に現在割り当てられている型を無効にするための修飾子があります。これらの修飾子は,コンパイラで生成された型だけでなく,SET TYPE または SET TYPE/OVERRIDE コマンドも無効にします。各コマンドで使用できる型修飾子については,DEPOSIT コマンドと EXAMINE コマンドを参照してください。
型修飾子を指定して EXAMINE コマンドを使用した場合,アドレス式で指定した要素がその型で表示されます。次に例を示します。
DBG> EXAMINE/BYTE . ! 型はバイト整数である。 MOD3\%LINE 15 : -48 DBG> EXAMINE/WORD . ! 型はワード整数である。 MOD3\%LINE 15 : 464 DBG> EXAMINE/LONG . ! 型はロングワード整数である。 MOD3\%LINE 15 : 749404624 DBG> EXAMINE/QUAD . ! 型はクォドワード整数である。 MOD3%LINE 15 : +0130653502894178768 DBG> EXAMINE/FLOAT . ! 型は F 浮動小数点数である。 MOD3%LINE 15 : 1.9117807E-38 DBG> EXAMINE/G_FLOAT . ! 型は G 浮動小数点数である。 MOD3%LINE 15 : 1.509506018605227E-300 DBG> EXAMINE/ASCII . ! 型は ASCII 文字列である。 MOD3\%LINE 15 : ".." DBG> |
型修飾子を指定して DEPOSIT コマンドを使用した場合,アドレス式で指定した記憶位置へその型の値が格納され,そのアドレス式に対応する型が上書きされます。
残りの項では,型修飾子と SET TYPE コマンドを使用して整数型,文字列型,およびユーザ宣言型を指定する例を示します。
4.5.2.1 整数型
次の例は,整数型修飾子(/BYTE,/WORD,/LONGWORD)を指定した EXAMINE コマンドと DEPOSIT コマンドの使用例です。これらの型修飾子を使用すれば,特定の整数型の値を任意のプログラム記憶位置へ格納することができます。
DBG> SHOW TYPE ! コンパイラ生成型を持たない type: long integer ! 記憶位置の型を表示する。 DBG> EVALU/ADDR . ! 現在の記憶位置は 724 である。 724 DBG> DEPO/BYTE . = 1 ! 値 1 をアドレス 724 の 1 バイトの ! メモリへ格納する。 DBG> EXAM . ! 省略時の設定では 4 バイトが検査される。 724: 1280461057 DBG> EXAM/BYTE . ! 1 バイトだけを検査する。 724: 1 DBG> DEPO/WORD . = 2 ! 値 2 を現在の値の最初の ! 2 バイト(ワード)へ格納する。 DBG> EXAM/WORD . ! 現在の値の 1 ワードを検査する。 724: 2 DBG> DEPO/LONG 724 = 999 ! 値 999 をアドレス 724 から始まる 4 バイト !(ロングワード)へ格納する。 DBG> EXAM/LONG 724 ! アドレス 724 から始まる 4 バイト 724: 999 !(ロングワード)を検査する。 DBG> |
次の例は,/ASCII:n 型修飾子を指定した EXAMINE コマンドと DEPOSIT コマンドの使用例です。
この修飾子を DEPOSIT コマンドで使用すると,長さ n の ASCII 文字列を任意のプログラム記憶位置に格納することができます。この例では,記憶位置はシンボリック名(I)を持っており,したがってコンパイラ生成型に対応付けられています。コマンドの形式は次のとおりです。
DEPOSIT/ASCII:n address-expression = "ASCII string of length n" |
n の省略時の値は 4 バイトです。
DBG> DEPOSIT I = "abcde" ! I はコンパイラ生成の整数型を持つ。 %DEBUG-W-INVNUMBER, invalid numeric string 'abcde' ! したがって,I には文字列を格納できない。 DBG> DEP/ASCII:5 I = "abcde"! /ASCII 修飾子によって整数型を上書きし, ! 5 バイトの ASCII データを格納 ! できるようにする。 DBG> EXAMINE . ! I の値をコンパイラ生成の整数型で MOD3\I: 1146048327 ! 表示する。 DBG> EXAM/ASCII:5 . ! I の値を 5 バイトの ASCII 文字列として MOD3\I: "abcde" ! 表示する。 DBG> |
複数の DEPOSIT/ASCII コマンドを入力する場合は,SET TYPE/OVERRIDE コマンドを使用して上書き ASCII 型を設定できます。その場合,それ以後の EXAMINE コマンドと DEPOSIT コマンドは /ASCII 修飾子を指定したのと同じ効果を持ちます。次に例を示します。
DBG> SET TYPE/OVER ASCII:5! ASCII:5 を上書き型として設定する。 DBG> DEPOSIT I = "abcde" ! I に 5 バイトの文字列を格納できるようになる。 DBG> EXAMINE I ! I の値を 5 バイトの MOD3\I: "abcde" ! ASCII 文字列として表示する。 DBG> CANCEL TYPE/OVERRIDE ! ASCII 上書き型を取り消す。 DBG> EXAMINE I ! I をコンパイラ生成型で表示する。 MOD3\I: 1146048327 DBG> |
次の例は,/TYPE=(name)修飾子を指定した EXAMINE コマンドと DEPOSIT コマンドの使用例です。この修飾子を使用すれば,検査または格納を行う際にユーザ宣言上書き型を指定できます。
たとえば,Pascal プログラムに次のコードが入っているとします。このコードは 3 つの値 RED,GREEN,および BLUE を持つ列挙型 COLOR を宣言します。
. . . TYPE COLOR =(RED,GREEN,BLUE); . . . |
デバッグ・セッションの間,次のように SHOW SYMBOL/TYPE コマンドはデバッガが認識しているとおりに型 COLOR を示します。
DBG> SHOW SYMBOL/TYPE COLOR data MOD3\COLOR enumeration type(COLOR, 3 elements), size: 1 byte DBG> |
次のコマンドはアドレス 1000 の値を表示します。この値はシンボリック名に対応付けられていません。したがって,省略時の設定では値 0 がロングワード整数型として表示されます。
DBG> EXAMINE 1000 1000: 0 DBG> |
次のコマンドはアドレス 1000 の値を型 COLOR で表示します。前の SHOW SYMBOL/TYPE コマンドで,それぞれの列挙要素が 1 バイトに格納されていることが示されています。したがって,デバッガはアドレス 1000 にあるロングワード整数値 0 の最初のバイトを,それに相当する列挙値 RED(3 つの列挙値の最初のもの)に変換します。
DBG> EXAMINE/TYPE=(COLOR)1000 1000: RED DBG> |
次の DEPOSIT コマンドは,上書き型 COLOR を持つアドレス 1000 に値 GREEN を格納します。EXAMINE コマンドは,アドレス 1000 の値を省略時の型であるロングワード整数で表示します。
DBG> DEPOSIT/TYPE=(COLOR)1000 = GREEN DBG> EXAMINE 1000 1000: 1 DBG> |
次の SET TYPE コマンドは,シンボリック名を持たないアドレス 1000 のような記憶位置に対して型 COLOR を設定します。EXAMINE コマンドは,1000 にある値を型 COLOR で表示するようになります。
DBG> SET TYPE TYPE=(COLOR) DBG> EXAMINE 1000 1000: GREEN DBG> |
シンボリック・デバッグでは,ソース・コード内に現れるとおりに,変数名,ルーチン名などを指定できます。ユーザは,プログラム記憶位置を参照する場合,数値メモリ・アドレスやレジスタを使用する必要はありません。
さらにユーザは,プログラムとそのソース言語に適切なコンテキストでシンボルを使用できます。デバッガは,要素の有効範囲と可視性,データ型,式などについて,使用している言語の規則をサポートします。
プログラムに対応するすべてのシンボルにアクセスするためには,/DEBUG コマンド修飾子を使用してそのプログラムをコンパイルおよびリンクしなければなりません。
これらの条件のもとでは,シンボル情報がソース・プログラムからデバッガに渡され処理される方法は,ほとんどの場合ユーザには見えません。しかし,何らかの対処が必要な場合もあります。
たとえば,COUNTER という名前のルーチンにブレークポイントを設定しようとすると,次の診断メッセージが表示されます。
DBG> SET BREAK COUNTER %DEBUG-E-NOSYMBOL, symbol 'COUNTER' is not in the symbol table DBG> |
このような場合,第 5.2 節 で説明するように,COUTNTER が定義されているモジュールを設定しなければなりません。
シンボル X が,2 つ以上のモジュール,ルーチン,または他のプログラム単位内で定義(宣言)されている場合は,次のメッセージが表示されます。
DBG> EXAMINE X %DEBUG-E-NOUNIQUE, symbol 'X' is not unique DBG> |
このような場合,第 5.3 節 で説明するように,シンボルのパス名を指定することによってシンボルのあいまいさを解消しなければなりません。
本章では,プログラム内シンボルのアクセスに関連する,上記およびその他の状況に対処する方法について説明します。
本章で説明するシンボル(通常は,アドレス式)は,ソース・プログラム内に存在するものだけです。
次のシンボルについては別の章で説明します。
また,シンボリック・アドレス式に対応するメモリ・アドレスやレジスタ名を取得したり,逆にプログラム記憶位置をシンボル化する方法についての詳しい説明は,第 4.1.11 項 を参照してください。
プログラムがコンパイル時に最適化されている場合,プログラム内の特定の変数がコンパイラによって除去されることがあります。このような変数を参照しようとすると,デバッガは警告を発行します(第 1.2 節 および 第 14.1 節 を参照)。 非静的変数(スタックローカル変数またはレジスタ変数)を参照する前には,その変数を定義しているルーチンが呼び出しスタック上でアクティブでなければなりません。すなわち,プログラムの実行が,非静的変数を定義しているルーチン内で停止していなければなりません(第 3.4.3 項 を参照)。 |
シンボリック・デバッグの機能を最大限に利用するためには,第 1.2 節 で説明したように,/DEBUG 修飾子を使用してプログラムをコンパイルおよびリンクする必要があります。
次の各項では,コンパイル時およびリンク時に,シンボル情報がどのように作成され,デバッガに渡されるのかを説明します。
5.1.1 コンパイル
/DEBUG 修飾子を使用してソース・ファイルをコンパイルすると,コンパイラは,デバッグ・シンボル・テーブル用のシンボル・レコード(DST レコード)を作成し,作成中のオブジェクト・モジュールにそれらを取り込みます。
DST レコードは,シンボル名だけでなく,次に示すようにその使用法に関連するすべての情報を提供します。
ほとんどのコンパイラでは,異なるオプションを /DEBUG 修飾子とともに指定すると,オブジェクト・モジュールに取り込むDST情報の量を調整することができます。表 5-1 に,ほとんどのコンパイラのオプションを示します。詳しい説明は,コンパイラ付属のドキュメントを参照してください。
コンパイラ・コマンド修飾子 | オブジェクト・モジュール内の DST情報 |
---|---|
/DEBUG1 | すべての情報 |
/DEBUG=TRACEBACK2 | トレースバック情報のみ(モジュール名,ルーチン名,行番号) |
/NODEBUG3 | 情報なし |
ほとんどのコンパイラの省略時の設定は TRACEBACK オプションです。すなわち,/DEBUG 修飾子を省略すると,ほとんどのコンパイラは,/DEBUG=TRACEBACK が指定されたものとみなします。TRACEBACK オプションを使用すると,実行時エラー発生時にシンボリック・トレースバックを出力できるように,トレースバック条件ハンドラがメモリ・アドレスをルーチン名と行番号に変換します。次に例を示します。
$ RUN FORMS . . . %PAS-F-ERRACCFIL, error in accessing file PAS$OUTPUT %PAS-F-ERROPECRE, error opening/creating file %RMS-F-FNM, error in file name %TRACE-F-TRACEBACK, symbolic stack dump follows module name routine name line rel PC abs PC PAS$IO_BASIC _PAS$CODE 00000192 00001CED PAS$IO_BASIC _PAS$CODE 0000054D 000020A8 PAS$IO_BASIC _PAS$CODE 0000028B 00001DE6 FORMS FORMS 59 00000020 000005A1 $ |
トレースバック情報は,デバッガの SHOW CALLS コマンドによっても使用されます。
5.1.2 ローカル・シンボルとグローバル・シンボル
DST レコードは,プログラム内で定義されているすべてのシンボルに関する情報を含んでいます。これらのシンボルはローカル・シンボルかグローバル・シンボルのどちらかです。
通常,ローカル・シンボル とは,それが定義されているモジュール内でのみ参照されるシンボルを意味します。一方 グローバル・シンボル とは,あるモジュール内で定義されていますが,別のモジュールから参照されるシンボルを意味します。ルーチン名,プロシージャ・エントリ・ポイント,またはグローバル・データ名などがグローバル・シンボルです。
ある共用可能イメージ内で定義され,別のイメージから参照されるグローバル・シンボル(プログラムの実行可能メイン・イメージなど)を ユニバーサル・シンボル と呼びます。共用可能イメージを作成する場合,リンク時にすべてのユニバーサル・シンボルを明示的に定義しなければなりません。ユニバーサル・シンボルと共用可能イメージについての詳しい説明は 第 5.4 節 を参照してください。
通常,コンパイラがローカル・シンボルへの参照を解決し,リンカがグローバル・シンボルへの参照を解決します。
ローカル・シンボルとグローバル・シンボルとの違いについては,シンボル検索および共用可能イメージとユニバーサル・シンボルとの関連で,本章の各箇所で説明します。
5.1.3 リンク
ユーザが LINK/DEBUG コマンドを入力し,オブジェクト・モジュールをリンクして実行可能なイメージを作成する場合,リンカはデバッグに影響を与えるいくつかの機能を実行します。
第 5.4 節 では,共用可能イメージをデバッグ用にリンクする方法を,ユニバーサル・シンボル(共用可能イメージ内に定義され,別のイメージから参照されるグローバル・シンボル)の定義方法といっしょに説明します。
表 5-2 には,デバッガに渡される DST 情報および GST 情報のレベルをコンパイラまたは LINK コマンド・オプション別にまとめてあります。コンパイラ・コマンド修飾子は,リンカに渡される DST 情報のレベルを制御します。LINK コマンド修飾子は,デバッガに渡される DST 情報と GST 情報の量だけでなく,プログラムをデバッガの制御下に置くことができるかどうかも制御します(第 1.2 節 を参照)。
コンパイラ・ コマンド 修飾子1 |
オブジェクト・ モジュール内の DST データ |
LINK コマンド 修飾子2 |
デバッガに 渡される DST データ |
デバッガに 渡される GST データ3 |
---|---|---|---|---|
/DEBUG | すべての情報 | /DEBUG | すべての情報 | すべての情報 |
/DEBUG=TRACE | トレースバック情報のみ | /DEBUG | トレースバック情報のみ | すべての情報 |
/NODEBUG | 情報なし | /DEBUG | 情報なし | すべての情報 |
/DEBUG | すべての情報 | /DSF4 | すべての情報 | すべての情報5 |
/DEBUG=TRACE | トレースバック情報のみ | /DSF4 | トレースバック情報のみ | すべての情報5 |
/NODEBUG | 情報なし | /DSF4 | 情報なし | すべての情報5 |
/DEBUG | すべての情報 | /TRACE6 | トレースバック情報のみ | すべての情報 |
/DEBUG=TRACE | トレースバック情報のみ | /TRACE | トレースバック情報のみ | すべての情報 |
/NODEBUG | 情報なし | /TRACE | 情報なし | すべての情報 |
/DEBUG | すべての情報 | /NOTRACE7 |
コンパイラ・コマンドに /NODEBUG 修飾子を指定し,その後イメージをリンクし実行すると,デバッガは,プログラムがデバッガの制御下に置かれたときに次のようなメッセージを発行します。
%DEBUG-I-NOLOCALS, image does not contain local symbols |
上記のメッセージは,/TRACEBACK 修飾子または /DEBUG 修飾子のどちらを使用してリンクした場合にも発行され,リンクされたイメージの DST が作成されなかったことを意味します。この場合,GST 内に含まれるグローバル・シンボルだけが使用可能となります。
LINK コマンドに /DEBUG 修飾子を指定しないと,デバッガは,プログラムがデバッガの制御下に置かれたときに次のようなメッセージを発行します。
%DEBUG-I-NOGLOBALS, some or all global symbols not accessible |
上記のメッセージは,デバッグ・セッション中に使用可能なグローバル・シンボル情報は,DST 内に格納されています。
これらの概念については,次の各節で説明します。特に,共用可能イメージのデバッグについての詳しい説明は,第 5.4 節 を参照してください。
前へ | 次へ | 目次 | 索引 |