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

4 プログラム・データの検査と操作

本章では,任意のプログラム記憶位置の内容とプログラム内で宣言したシンボルの値を表示したり変更したりするためのEXAMINE コマンドとDEPOSIT コマンドの使用法について説明します。また,言語式を評価するEVALUATE などのコマンドの使用法についても説明します。

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

本章の例には言語固有のすべての動作が含まれているわけではありません。 どの言語でデバッグを行う場合でも,次の説明を必ず参照してください。

4.1 概要

この節ではEXAMINE,DEPOSIT,EVALUATEの各コマンドを紹介し,これらのコマンドに共通した概要を説明します。

4.1.1 デバッグ時の変数へのアクセス


注意
ここでは総称して非静的変数という用語を使用しますが, ある言語では自動変数と呼ぶ場合もあります。

非静的(スタック・ローカルまたはレジスタ)変数を検査したり,そこに値を格納したりするには, その変数を定義しているルーチンが呼び出しスタック上でアクティブでなければなりません。 すなわち,定義しているルーチン内のどこかでプログラムの実行が一時停止していなければなりません。 非静的変数についての詳しい説明は,第3.4.3 項を参照してください。

静的変数はプログラム実行中にいつでも検査でき,非静的変数は,それを定義しているルーチンへ到達したときに検査できます。 しかし,変数を検査する前に, それが宣言され初期化されている場所を越えてプログラムを実行するようにしてください。 初期化されていない変数に含まれる値は無効とみなさなければなりません。

多くのコンパイラでは,プログラムの実行速度を向上させるためにコードを最適化します。 デバッグ中のコードが最適化されたものである場合は, プログラム記憶位置がソース・コードから予想したものと一致しないことがあります。 特に,最適化技法の中には,特定の変数を排除するものがあるので, デバッグ時にそれらの変数へはアクセスできなくなります。

第14.1節には,実行可能コードに対するいくつかの最適化技法の効果が説明されています。 最初にプログラムをデバッグする場合は, できれば/NOOPTIMIZEまたはそれに相当するコンパイラ・ コマンド修飾子を使用して最適化を禁止するのが最善の方法です。

EXAMINEコマンドまたはDEPOSITコマンドを変数名,またはその他のシンボリック・ アドレス式といっしょに使用する場合,モジュールの設定や有効範囲かパス名の指定が必要になることがあります。 それらの概念は第5章で説明します。 本章の例では,すべてのモジュールが設定され, すべての変数名が固有に定義されることと想定しています。

4.1.2 EXAMINEコマンドの使用

高級言語プログラムでは,EXAMINEコマンドはほとんどの場合,変数の現在の値を表示するために使用され, 次の構文をとります。

     EXAMINE address-expression[, . . . ]

たとえば次のコマンドは整変数Xの現在の値を表示します。

     DBG> EXAMINE X
     MOD3\X:   17
     DBG>

値を表示する場合,デバッガは変数名の前にパス名(この場合は変数Xが宣言されているモジュールの名前) を付けます(第5.3.2 項を参照)。

一般的には,EXAMINEコマンドはアドレス式で表された要素の現在の値を, その記憶位置に対応づけられた型(たとえば,整数,実数,配列,レコードなど) で表示します。

EXAMINEコマンドを入力すると,デバッガはプログラム記憶位置(メモリ・ アドレスまたはレジスタ)を得るためにアドレス式を評価します。その後, デバッガはその記憶位置に格納されている値を次のように表示します。

シンボリック・アドレス式および非シンボリック・アドレス式に対応する型についての詳しい説明は, 第4.1.5項を参照してください。

省略時の設定では,デバッガは値を表示する場合にシンボル情報が入手できるのであれば, アドレス式とそのパス名をシンボルによって示します。 アドレスのシンボル化についての詳しい説明は第4.1.11項を参照してください。

4.1.3 DUMPコマンドの使用

DCLのDUMPコマンドと同じ方法でメモリの内容を表示するには,次のいずれかの形式でデバッガのDUMP コマンドを使用します。


Binary
Byte
Decimal
Hexadecimal
Longword (省略時の設定)
Octal
Quadword
Word

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

     DUMP address-expression1[:address-expression2]

address-expression2 の省略時の設定はaddress- expression1 です。たとえば,次のコマンドはレジスタR16〜R25 の現在の値をクォドワード形式で表示します。

     DBG> DUMP/QUADWORD R16:R25
      0000000000000078 0000000000030038 8.......x....... %R16
      000000202020786B 0000000000030041 A.......kx   ... %R18
      0000000000030140 0000000000007800 .x......@....... %R20
      0000000000010038 0000000000000007 ........8....... %R22
      0000000000000006 0000000000000000 ................ %R24

     DBG>

DUMPコマンドを使用すると,レジスタ,変数,配列の内容を表示できます。 デバッガは配列の構造体を解釈しません。次の修飾子は,デバッガがDUMP コマンドからの出力を表示する方法を指定します。

修飾子 出力の形式
/BINARY 2進整数
/BYTE 1バイトの整数
/DECIMAL 10進整数
/HEXADECIMAL 16進整数
/LONGWORD ロングワード整数(4バイト長)
/OCTAL 8進整数
/QUADWORD クォドワード整数(8バイト長)
/WORD ワード整数(2 バイト長)

省略時の設定では,デバッガは,確認した値がコンパイラで生成されるデータ型でない場合, それをロングワードとして表示します。

4.1.4 DEPOSITコマンドの使用

高級言語では,DEPOSITコマンドはほとんどの場合,変数に新しい値を代入するために使用されます。 このコマンドは,多くのプログラミング言語の代入文と似ていて, 次の構文をとります。

     DEPOSIT address-expression = language-expression

たとえば次のDEPOSITコマンドは整変数Xに値23を代入します。

     DBG> EXAMINE X
     MOD3\X:   17
     DBG> DEPOSIT X = 23
     DBG> EXAMINE X
     MOD3\X:   23
     DBG>

一般的には,DEPOSITコマンドは言語式を評価し,その結果の値をアドレス式で表されたプログラム記憶位置に格納します。

DEPOSITコマンドを入力すると,デバッガは次のことを行います。

その言語の規則で許されていれば,デバッガは格納操作時に型変換を行うことがあるので注意してください。 たとえば,Xが整変数である場合,次の例では実数値2.0 は整数値2へ変換され,その後でXに代入されます。

     DBG> DEPOSIT X = 2.0
     DBG> EXAMINE X
     MOD3\X:   2
     DBG>

通常,デバッガは現在の言語の代入規則に従おうとします。

4.1.5 アドレス式とそれに対応した型

プログラム内で宣言したシンボル(変数名,ルーチン名など)は,シンボリック・ アドレス式です。それらはメモリ・アドレスかレジスタを表します。 シンボリック・アドレス式(本章では「シンボリック名」とも呼ぶ)はコンパイラ生成型を持ち, デバッガはシンボリック名に対応する型と記憶位置が分かっています。 シンボリック名からメモリ・アドレスとレジスタ名を取得する方法と, プログラム記憶位置をシンボル化する方法については, 第4.1.11項を参照してください。

シンボリック名には次のカテゴリがあります。

シンボリック名を持たないプログラム記憶位置は,コンパイラ生成型に対応づけられません。 そのような記憶位置を検査したりそこに値を格納したりできるようにするため, デバッガはそれらの記憶位置を省略時の型であるロングワード整数へ対応づけます。 シンボリック名を持たない記憶位置を指定した場合には,EXAMINE コマンドは指定されたアドレスから始まる4 バイトの内容を表示し,表示される情報を整数値として編集します。次の例では, メモリ・アドレス926はシンボリック名に対応づけられていません(EXAMINE コマンドを実行した場合,このアドレスはシンボル化されないことに注意してください) 。したがって,EXAMINEコマンドはそのアドレスの値をロングワード整数として表示します。

     DBG> EXAMINE 926
     926:  749404624
     DBG>

省略時の設定では,シンボリック名を持たないプログラム記憶位置へ最高4 バイトの整数データを格納できます。このデータはロングワード整数として編集されます。 次に例を示します。

     DBG> DEPOSIT 926 = 84
     DBG> EXAMINE 926
     926:  84
     DBG>

シンボリック名を持たない記憶位置を検査する方法とそこへ値を格納する方法については, 第4.5節で説明します。

EXAMINEコマンドとDEPOSITコマンドには型修飾子(/ASCII:n, /BYTEなど)が使用でき,これらを使用すればプログラム記憶位置と対応した型を上書きすることができます。 これは,記憶位置の内容を別の型で解釈し表示する場合や, 特定の型の値を別の型に対応づけられた記憶位置に格納したい場合に役立ちます。 型を上書きする方法については第4.5節で説明します。

4.1.6 言語式の評価

言語式は,1つまたは複数のシンボル,リテラル,および演算子を組み合わせたものからなり, 現在の言語の構文と現在の基数で1つの値として評価されます。 現在の言語と現在の基数は,それぞれ第4.1.9項第4.1.10 項に定義されています。次のデバッガ・コマンドと構造は言語式を評価します。

この説明は言語式を評価するすべてのコマンドと構造に対して当てはまりますが, 特にEVALUATEコマンドの使用を念頭に置いています。

EVALUATEコマンドは1つまたは複数の言語式を現在の言語の構文と現在の基数で評価し, その結果の値を表示します。このコマンドは次の形式をとります。

     EVALUATE language-expression[, . . . ]

EVALUATEコマンドの使用例の1つは,プログラムに関連のない算術演算を行うために使用するものです。 次に例を示します。

     DBG> EVALUATE (8+12)*6/4
     30
     DBG>

デバッガは,言語式を評価する場合,現在の言語の演算子プロシージャの規則を使用します。

変数とその他の構造を含む言語式を評価することもできます。たとえば, 次のEVALUATEコマンドは整変数Xの現在の値から3を差し引き,その結果に4 を掛けた結果の値を表示します。

     DBG> DEPOSIT X = 23
     DBG> EVALUATE (X - 3) * 4
     80
     DBG>

しかし,関数呼び出しを含む言語式を評価することはできません。たとえば,PRODUCT が2つの整数を掛け合わせる関数である場合に,EVALUATE PRODUCT(3 ,5)コマンドを入力することはできません。プログラムで関数の戻り値を変数に代入する場合は, その変数の結果の値を検査することができます。

式にさまざまなコンパイラ生成型のシンボルが入っている場合,デバッガは式を評価するために現在の言語の型変換規則を使用します。 型に互換性がなければ, 診断メッセージが発行されます。言語式内での演算子とその他の構造のデバッガ・ サポートはデバッガのオンライン・ヘルプに各言語ごとにリストしてあります(HELP Language を入力します)。

組み込みシンボル%CURVALは現在の値(EVALUATEコマンドまたはEXAMINE コマンドが最後に表示した値,あるいはDEPOSITコマンドによって格納された値) を表します。バックスラッシュ(\)もまた,その状況で使用された場合は現在の値を表します。 次に例を示します。

     DBG> EXAMINE X
     MOD3\X:  23
     DBG> EVALUATE %CURVAL
     23
     DBG> DEPOSIT Y = 47
     DBG> EVALUATE \
     47
     DBG>

4.1.6.1 言語式での変数の使用

言語式内では,プログラムのソース・コード内で変数を使用するのとほぼ同じように変数を使用できます。

したがって,デバッガは通常,言語式内で使用された変数をその変数のアドレスとしてではなく, その変数の現在の値として解釈します。次に例を示します(X は整変数)。

     DBG> DEPOSIT X = 12     ! 値 12 を X に代入する。
     DBG> EXAMINE X          ! X の値を表示する。
     MOD4\X:  12
     DBG> EVALUATE X         ! X の値を評価して表示する。
     12
     DBG> EVALUATE X + 4     ! X の値に 4 を加える。
     16
     DBG> DEPOSIT X = X/2    ! X の値を 2 で割り,その結果の値を
                             ! X に代入する。
     DBG> EXAMINE X          ! X の新しい値を表示する。
     MOD4\X:   6
     DBG>

上記の例で示したような言語式内での変数の使用は,通常,単一値の非複合変数に限られます。 通常,複数値の複合変数(配列やレコードなど)を言語式内で指定できるのは, その構文が単一値(集合体の1要素)だけを参照するための構文である場合だけです。 たとえば,ARRが整数配列の名前である場合, 次のコマンドは無効です。

     DBG> EVALUATE ARR
     %DEBUG-W-NOVALUE, reference does not have a value
     DBG>

しかし,次のコマンドは配列の1要素だけを参照しているので有効です。

     DBG> EVALUATE ARR(2)         ! 配列 ARR の要素 2 を評価する。
     37
     DBG> DEPOSIT K = 5 + ARR(2)  ! 2 つの整数値の合計を
     DBG>                         ! 1 つの整変数に格納する。

現在の言語がBLISSの場合,デバッガは言語式内の変数をその変数のアドレスとして解釈します。 変数内に格納されている値を示すには,内容演算子( ピリオド(.))を使用しなければなりません。たとえば,言語がBLISS に設定されている場合は次のとおりです。

     DBG> EXAMINE Y           ! Y の値を表示する。
     MOD4\Y:  3
     DBG> EVALUATE Y          ! Y のアドレスを表示する。
     02475B
     DBG> EVALUATE .Y         ! Y の値を表示する。
     3
     DBG> EVALUATE Y + 4      ! Y のアドレスに 4 を加算し
     02475F                   ! その結果の値を表示する。
     DBG> EVALUATE .Y + 4     ! Y の値に 4 を加算し
     7                        ! その結果の値を表示する。
     DBG>

どの言語の場合も,変数のアドレスを取得するには,第4.1.11項に述べるようにEVALUATE/ADDRESSコマンドを使用します。EVALUATE コマンドとEVALUATE/ADDRESSコマンドは, 言語がBLISSに設定してある場合,どちらもアドレス式のアドレスを表示します。

4.1.6.2 デバッガによる数値の型変換

精度が異なる複数の数値型が入っている言語式を評価する場合,デバッガは評価の前にまず精度が低いほうの型を高い精度へ変換します。 次の例では, デバッガは加算を行う前に整数1を実数の1.0へ変換します。

     DBG> EVALUATE 1.5 + 1
     2.5
     DBG>

基本的な規則は次のとおりです。

通常,デバッガではプログラミング言語より多様な数値の型変換ができます。 また,デバッガの計算に使用されるハードウェア型(ワード,ロングワード,G 浮動小数点数など)が,コンパイラの選択する型と異なる場合があります。 デバッガは一部の言語ほど型指定が強力でなく厳密でもないので,EVALUATE コマンドによる式の評価が,コンパイラ生成コードによって計算されEXAMINE コマンドによって得られる結果と異なる場合もあります。

4.1.7 言語式と比較した場合のアドレス式

アドレス式を言語式と混同してはなりません。アドレス式がプログラム記憶位置を指定するのに対し, 言語式は値を指定します。特に,EXAMINEコマンドはアドレス式をパラメータとして想定し,EVALUATE コマンドは言語式をパラメータとして想定します。 これらの点を次の例に示します。

この例では,変数Xに値12が格納されます。これはEXAMINEコマンドによって確認されます。EVALUATE コマンドは,現在のXの値と整数リテラル6の和を計算して表示します。

     DBG> DEPOSIT X = 12
     DBG> EXAMINE X
     MOD3\X: 12
     DBG> EVALUATE X + 6
     18
     DBG>

次の例では,EXAMINEコマンドは,Xのアドレスを6バイト超えたメモリ記憶位置に現在格納されている値を表示します。

     DBG> EXAMINE X + 6
     MOD3\X+6: 274903
     DBG>

この場合,記憶位置はコンパイラ生成型に対応づけられていません。したがって, デバッガはその記憶位置に格納されている値をロングワード整数型で解釈し表示します( 第4.1.5項を参照)。

次の例では,X + 6 (つまり18)の値がXのアドレスを6バイト超えた記憶位置に格納されます。 これは最後のEXAMINEコマンドによって確認されます。

     DBG> EXAMINE X
     MOD3\X: 12
     DBG> DEPOSIT X + 6 = X + 6
     DBG> EXAMINE X
     MOD3\X: 12
     DBG> EXAMINE X + 6
     MOD3\X+6: 18
     DBG>

4.1.8 現在の値,前の値,および次の値の指定

EXAMINEコマンドとDEPOSITコマンドを使用する場合,現在と前と次の各データ記憶位置( 論理要素)を高速に参照するため,3つの特殊な組み込みシンボル( アドレス式)が使用できます。それらは,ピリオド(.)とサーカンフレックス(^) とReturnキーです。

EXAMINEコマンドまたはDEPOSITコマンドといっしょにピリオド(.)だけを使用した場合, それは現在の値(EXAMINEコマンドまたはDEPOSITコマンドによって参照された最新のプログラム記憶位置) を表します。次に例を示します。

     DBG> EXAMINE X
     SIZE\X: 7
     DBG> DEPOSIT . = 12
     DBG> EXAMINE .
     SIZE\X: 12
     DBG>

サーカンフレックス(^)とReturnキーはそれぞれ,前と次の論理データ記憶位置を最新のEXAMINE コマンドまたはDEPOSITコマンドとの相対関係で表します( それぞれ,論理的先行データと論理的後続データに相当します)。 サーカンフレックスとReturnキーは,配列の連続した添字付き要素を参照するのに役立ちます。 次の例は,これらの演算子の使用法を整数配列ARR を使用して示しています。

     DBG> EXAMINE ARR(5)    ! 配列 ARR の要素 5 を検査する。
     MAIN\ARR(5): 448670
     DBG> EXAMINE ^         ! 前の要素 (4) を検査する。
     MAIN\ARR(4): 792802
     DBG> EXAMINE <Return>  ! 次の要素 (5) を検査する。
     MAIN\ARR(5): 448670
     DBG> EXAMINE <Return>  ! 次の要素 (6) を検査する。
     MAIN\ARR(6): 891236
     DBG>

デバッガは,論理的後続データと論理的先行データを判別するために現在の値に対応する型を使用します。

ピリオド,サーカンフレックス,およびReturnキーと同じ目的で,組み込みシンボルの%CURLOC ,%PREVLOC,および%NEXTLOCを使用することもできます。 これらのシンボルはコマンド・プロシージャ内で役立つほか,プログラムでサーカンフレックスを別の目的に使用する場合に便利です。 さらに, 論理的後続データを示すためにReturnキーを使用することは,すべての状況に適用できるわけではありません。 たとえば,DEPOSITコマンドを入力したあとで次の記憶位置を示すためにReturn キーを押すことはできませんが, シンボル%NEXTLOCならば同じ目的で常に使用することができます。

EXAMINEコマンドおよびDEPOSITコマンドと同様に,EVALUATE/ADDRESSコマンドも現在と前と次の論理要素組み込みシンボルの値を再設定します( 第4.1.11項を参照)。ただし,EVALUATE /ADDRESSコマンドを入力したあとに,次の記憶位置を示すためにReturnキーを押すことはできません。 デバッガの組み込みシンボルについての詳しい説明は, 付録 Bを参照してください。

上記の例は,EXAMINEコマンドまたはDEPOSITコマンドでシンボリック名を参照したあとの組み込みシンボルの使用を示したものです。 メモリ・アドレスの検査やそこへの値の格納を行う場合, その記憶位置がコンパイラ生成型に対応づけられている場合もそうでない場合もあります。 メモリ・アドレスを参照する場合, デバッガは論理的先行データと論理的後続データを判別するために次の規則を使用します。

現在の値が新しい検査操作または格納操作によって再設定されたとき,デバッガは, 論理的後続データおよび論理的先行データを判別するために指示された方法で新しい記憶位置を型に対応づけます。 次に例を示します。

FORTRANプログラムで3つの変数,ARY,FLT,およびBTEを次のように宣言したと想定します。

これらの変数用の記憶域が,メモリ内の1000から始まる連続したアドレスに割り当てられたと想定します。 次に例を示します。

     1000: ARY(1)
     1002: ARY(2)
     1004: ARY(3)
     1006: FLT
     1010: BTE
     1011: undefined
        .
        .
        .

連続した論理データ記憶位置を検査すると,次の結果が得られます。

     DBG> EXAMINE 1000         ! 1000 に対応した ARY(1) を検査する。
     MOD3\ARY(1):  13          ! 現在の値はこの時点で ARY(1) となる。
     DBG> EXAMINE <Return>     ! 次の記憶位置 ARY(2) を検査する。
     MOD3\ARY(2):   7          ! その際,ARY(1) の型を参照する。
     DBG> EXAMINE <Return>     ! 次の記憶位置 ARY(3) を検査する。
     MOD3\ARY(3):  19          ! 現在の値はこの時点で ARY(3) となる。
     DBG> EXAMINE <Return>     ! 1006 の値 (FLT) を検査する。
     MOD3\FLT:  1.9117807E+07  ! 現在の値はこの時点で FLT となる。
     DBG> EXAMINE <Return>     ! 1010 の値 (BTE) を検査する。
     MOD3\BTE:   43            ! 現在の値はこの時点で BTE となる。
     DBG> EXAMINE <Return>     ! 1011 の値 (未定義) を検査する。
     1011: 17694732            ! データをロングワード整数として解釈する。
     DBG>                      ! 記憶位置はシンボル化されていない。

これと同じ原則が,EXAMINEコマンドおよびDEPOSITコマンドに型修飾子を使用する場合でも適用されます( 第4.5.2 項を参照)。修飾子の指定する型によって要素のデータ境界が判別され, したがって論理的後続データと論理的先行データも判別されます。

4.1.9 言語固有性と現在の言語

デバッガでは,デバッグ・コンテキストをいずれかのサポートされた言語へ設定することができます。 現在の言語を設定することにより,デバッガ・ コマンド内にユーザが指定する名前,数字,演算子,および式をデバッガが解析し解釈する方法と, データを表示する方法が決まります。

省略時の設定では,メイン・プログラムを含むモジュールの言語が現在の言語となり, それはユーザがプログラムをデバッガの制御下に置いた時点で識別されます。 次に例を示します。

     $ PASCAL/NOOPTIMIZE/DEBUG TEST1
     $ LINK/DEBUG TEST1
     $ DEBUG/KEEP

                Debugger Banner and Version Number

     DBG> RUN TEST1
     Language: PASCAL, Module: TEST1
     DBG>

別の言語で作成されたコードを持つモジュールをデバッグする場合には, 新しい言語固有コンテキストを設定するためにSET LANGUAGEコマンドを使用できます。 第14.3節に重要な言語の相違点が説明してあります。 言語式内の演算子とその他の構造に関するデバッガ・ サポートは,各言語別にデバッガのオンライン・ヘルプに示されています(HELP Language と入力します)。

4.1.10 整数データを入力または表示するための基数の指定

デバッガは,整数データを4つの基数(10進数,16進数,8進数,2進数)のいずれかで解釈し表示することができます。 ほとんどの言語の場合,省略時の基数は10 進数です。

VAXプロセッサではBLISSとMACROは例外で,これらの省略時の基数は10 進数です。

AlphaプロセッサではBLISSとMACRO-32とMACRO- 64は例外で,これらの省略時の基数は10進数です。

次の種類の整数データでは,基数を制御することができます。

このほかの種類の整数データでは,基数を制御できません。たとえば,アドレスはSHOW CALLS の表示では常に16進数を基数として表示されます。また, 各種のコマンド修飾子(/AFTER:n,/UP:nなど) といっしょに整数nを指定する場合には,10進数を基数として使用しなければなりません。

基数の制御に使用する方法は,目的によって異なります。以後のすべてのコマンドに対して新しい基数を設定するには,SET RADIX コマンドを使用します。 次に例を示します。

     DBG> SET RADIX HEXADECIMAL

このコマンドが実行されたあと,ユーザがアドレス式または言語式の中へ入力するすべてのデータは16 進数として解釈されます。また,EVALUATEコマンドおよびEXAMINE コマンドによって表示されるすべての整数データも16 進数を基数として表示されます。

SHOW RADIXコマンドは現在の基数(省略時の基数,またはSET RADIXコマンドによって設定された最新の基数) を表示します。次に例を示します。

     DBG> SHOW RADIX
     input radix: hexadecimal
     output radix: hexadecimal
     DBG>

SHOW RADIXコマンドは入力基数(データ入力用)と出力基数 (データ表示用)の両方を表示します。SET RADIXコマンドの修飾子/INPUT および/OUTPUTを使用すれば,データの入力用と表示用に別の基数を指定できます。 詳しい説明はオンライン・ヘルプのSET RADIXコマンドの説明を参照してください。

省略時の基数を復元するにはCANCEL RADIXコマンドを使用します。

次の例では,現在の基数を変更せずに別の基数で整数データを表示させたり入力したりするための方法をいくつか示します。

現在の基数を変更せずに整数データを別の基数へ変換するには,EVALUATE コマンドに基数修飾子(/BINARY,/DECIMAL,/HEXADECIMAL,/OCTAL)を指定します。 次に例を示します。

     DBG> SHOW RADIX
     input radix: decimal
     output radix: decimal
     DBG> EVALUATE 18 + 5
     23                         ! 23 is decimal integer.
     DBG> EVALUATE/HEX 18 + 5
     00000017                   ! 17 is hexadecimal integer.
     DBG>

基数修飾子はデータ入力用の基数には影響を及ぼしません。

整変数の現在の値(または,整数型を持つプログラム記憶位置の内容)を別の基数で表示するには,EXAMINE コマンドに基数修飾子を指定します。次に例を示します。

     DBG> EXAMINE X
     MOD4\X: 4398                ! 4398 は 10 進整数である。
     DBG> EXAMINE/OCTAL .        ! X は現在の値である。
     MOD4\X: 00000010456         ! 10456 は 8 進整数である。
     DBG>

1つまたは複数の整数リテラルを,現在の基数を変更せずに別の基数で入力するには, 基数組み込みシンボル%BIN,%DEC,%HEX,%OCTのいずれかを使用します。 基数組み込みシンボルは,次にある整数リテラルまたは括弧で囲まれた式内のすべての数値リテラルをそれぞれ2 進数,10進数,16進数, または8進数として扱うようデバッガに指示します。これらのシンボルはデータ表示用の基数には影響を及ぼしません。 次に例を示します。

     DBG> SHOW RADIX
     input radix: decimal
     output radix: decimal
     DBG> EVAL %BIN 10              ! 2 進整数 10 を評価する。
     2                              ! 2 は 10 進整数である。
     DBG> EVAL %HEX (10 + 10)       ! 16 進整数 20 を評価する。
     32                             ! 32 は 10 進整数である。
     DBG> EVAL %HEX 20 + 33         ! 20 を 16 進数,33 を 10 進数として扱う。
     65                             ! 65 は 10 進整数である。
     DBG> EVAL/HEX %OCT 4672        ! 4672 を 8 進数として扱い 16 進数で表示する。

     000009BA                       ! 9BA は 16 進数である。
     DBG> EXAMINE X + %DEC 12       ! X のアドレスを 12 (10 進) バイト超えた
     MOD3\X+12:  493847             ! 記憶位置を検査する。
     DBG> DEPOS J = %OCT 7777777    ! 8 進数値を格納する。
     DBG> EXAMINE .                 ! その値を 10 進数を基数として表示する。
     MOD3\J:  2097151
     DBG> EXAMINE/OCTAL .           ! その値を 8 進数を基数として表示する。
     MOD3\J:  00007777777
     DBG> EXAMINE %HEX 0A34D        ! 記憶位置 A34D(16 進数) を検査する。
     SHARE$LIBRTL+4941:  344938193  ! 344938193 は 10 進整数である。
     DBG>

注意
数字ではなく英字で始まる16 進整数(上記の例ではA34D)を指定する場合は,その前に0を付けます。0を付けないと, デバッガはその整数をプログラム内で宣言されたシンボルとして解釈しようとします。

基数組み込みシンボルについての例は,付録 B にもあります。

4.1.11 メモリ・アドレスの取得とシンボル化

変数名,行番号,ルーチン名,またはラベルなどのシンボリック・アドレス式に対応づけられたメモリ・ アドレスまたはレジスタ名を判別するには,EVALUATE/ADDRESS コマンドを使用します。次に例を示します。

     DBG> EVALUATE/ADDRESS X       ! 変数名
     2476
     DBG> EVALUATE/ADDRESS SWAP    ! ルーチン名
     1536
     DBG> EVALUATE/ADDRESS %LINE 26
     1629
     DBG>

アドレスは,(第4.1.10項で定義したとおり) 現在の基数で表示されます。アドレスを別の基数で表示したい場合は基数修飾子を指定できます。 次に例を示します。

     DBG> EVALUATE/ADDRESS/HEX X
     000009AC
     DBG>

変数がメモリ・アドレスではなくレジスタに対応づけられている場合, EVALUATE/ADDRESSコマンドは,基数修飾子が使用されているかどうかに関係なくレジスタの名前を表示します。 次のコマンドは変数K(非静的変数) がレジスタR2に対応することを示します。

     DBG> EVALUATE/ADDRESS K
     %R2
     DBG>

EXAMINEコマンドおよびDEPOSITコマンドと同様に,EVALUATE/ADDRESS は現在と前と次の論理要素組み込みシンボルの値を再設定します(第4.1.8項を参照)。EVALUATE コマンドとは異なり,EVALUATE/ADDRESS は現在の値の組み込みシンボル%CURVALおよびバックスラッシュ(\) に影響を及ぼしません。

SYMBOLIZEコマンドの動作はEVALUATE/ADDRESSの動作とは逆ですが,現在, 前,または次の論理要素組み込みシンボルに影響を及ぼしません。このコマンドは, メモリ・アドレスまたはレジスタ名をシンボリック表現( パス名を含む)に変換します。ただし,そのような表現が可能な場合です( 第5章にシンボル化を制御する方法が説明されています) 。たとえば,次のコマンドは変数KがレジスタR2に対応することを示します。

     DBG> SYMBOLIZE %R2
     address MOD3\%R2:
         MOD3\K
     DBG>

省略時の設定では,シンボリック・モードが有効(SET MODE SYMBOLIC)になります。 したがって,デバッガはシンボルがアドレスに使用できる場合, アドレスをすべてシンボルで表示します。たとえば,EXAMINEコマンドで数値アドレスを指定した場合, シンボリック情報が入手できるのであれば, そのアドレスは次のようにシンボリック形式で表示されます。

     DBG> EVALUATE/ADDRESS X
     2476
     DBG> EXAMINE 2476
     MOD3\X:  16
     DBG>

ただし,変数に対応するレジスタを指定した場合,EXAMINEコマンドはそのレジスタ名を変数名に変換しません。 次に例を示します。

     DBG> EVALUATE/ADDRESS K
     %R2
     DBG> EXAMINE %R2
     MOD3\%R2:  78
     DBG>

SET MODE NOSYMBOLICコマンドを入力した場合にはシンボリック・モードが禁止され, デバッガはシンボリック名でなく数値アドレスを表示します。 シンボル化を禁止した場合,デバッガは数字を名前に変換する必要がないので, コマンドの処理がいくらか速くなることがあります。 EXAMINEコマンドには,単一のEXAMINEコマンドのシンボル化を制御できる/[NO]SYMBOLIC 修飾子があります。次に例を示します。

     DBG> EVALUATE/ADDRESS Y
     512
     DBG> EXAMINE 512
     MOD3\Y:  28
     DBG> EXAMINE/NOSYMBOLIC 512
     512:  28
     DBG>

シンボリック・モードはまた,命令の表示にも影響を及ぼします。

たとえば,VAXプロセッサでは次のとおりです。

     DBG> EXAMINE/INSTRUCTION .%PC
     MOD5\%LINE 14+2: MOVAL   L^MOD4\X,R11
     DBG> EXAMINE/NOSYMBOL/INSTRUCTION .%PC
     1538:   MOVAL   L^1080,R11
     DBG>

4.2 変数の検査と値の格納

この節の例はEXAMINEコマンドとDEPOSITコマンドでの変数の使用法を示しています。

言語が使用する変数の型,それらの型の名前,および式の中に各種の型を混在させることができる程度は, 言語によって異なります。ここでは次の汎用型について説明します。

高級言語プログラム内の変数を検査および操作する場合の最も重要な関連事項は, デバッガがプログラム内の変数の名前,構文,型制約,有効範囲規則を認識するということです。 したがって,EXAMINEコマンドまたはDEPOSIT コマンドで変数を指定する場合,ソース・コードに使用する構文と同じ構文を使用します。 デバッガはその構文に従ってデータを処理し, 表示します。同様に,変数に値を代入する場合も,デバッガはその言語の型指定規則に従います。 ユーザが互換性のない値を格納しようとした場合には, 診断メッセージが発行されます。以降の例には,そのような無効な操作とその結果生じる診断も含まれています。

DEPOSITコマンド(またはその他のコマンド)を使用する場合,次の動作に注意してください。 デバッガが重大度I(情報)の診断メッセージが発行した場合でも, コマンドは実行されます(DEPOSITコマンドの場合は格納される) 。デバッガが違法なコマンド行を強制終了するのは,メッセージの重大度がW( 警告)以上の場合だけです。

言語固有情報についての詳しい説明は,デバッガのオンライン・ヘルプを参照してください(HELP Language と入力します)。

4.2.1 スカラ型

次の例は,EXAMINE,DEPOSIT,EVALUATEの各コマンドで整数型,実数型, 型を使用した例です。

3つの整変数のリストを検査します。

     DBG> EXAMINE WIDTH, LENGTH, AREA
     SIZE\WIDTH:   4
     SIZE\LENGTH:  7
     SIZE\AREA:   28
     DBG>

整数式を格納します。

     DBG> DEPOSIT WIDTH = CURRENT_WIDTH + 10
     DBG>

デバッガは,代入する値が変数のデータ型の制約と大きさの制約に適合するかどうかを調べます。 次の例は境界外の値(Xは正の整数として宣言されている) を格納しようとした場合です。

     DBG> DEPOSIT X = -14
     %DEBUG-I-IVALOUTBNDS, value assigned is out of bounds at or near DEPOSIT
     DBG>

1つの言語式の中に複数の数値型(精度が異なる整数と実数)を混在させようとした場合, デバッガは通常,その言語の規則に従います。データ型が強力な言語では, そのような混在は好ましくありません。一部の言語では, 実数値を整変数に格納することができます。ただし,実数値が整数に変換されます。 次に例を示します。

     DBG> DEPOSIT I = 12345
     DBG> EXAMINE I
     MOD3\I:  12345
     DBG> DEPOSIT I = 123.45
     DBG> EXAMINE I
     MOD3\I:  123
     DBG>

1つの式に複数の数値型が混在する場合,デバッガは第4.1.6.2項に述べたような型変換を行います。 次に例を示します。

     DBG> DEPOSIT Y = 2.356     ! Y は D 浮動小数点数型である。
     DBG> EXAMINE Y
     MOD3\Y: 2.35600000000000
     DBG> EVALUATE Y + 3
     5.35600000000000
     DBG> DEPOSIT R = 5.35E3    ! R は F 浮動小数点数型である。
     DBG> EXAMINE R
     MOD3\R:  5350.000
     DBG> EVALUATE R*50
        267500.0
     DBG> DEPOSIT I = 22222
     DBG> EVALUATE R/I
        0.2407524
     DBG>

次の例は,論理型変数を使用した操作を示しています。値TRUEとFALSEが変数WILLING とABLEにそれぞれ代入されます。その後,EVALUATEコマンドでそれらの値の論理積を求めています。

     DBG> DEPOSIT WILLING = TRUE
     DBG> DEPOSIT ABLE = FALSE
     DBG> EVALUATE WILLING AND ABLE
     False
     DBG>

4.2.2 ASCII文字列型

ASCII文字列の値を表示する場合,デバッガは値をその言語の構文に従って二重引用符(") か一重引用符(')で囲みます。次に例を示します。

     DBG> EXAMINE EMPLOYEE_NAME
     PAYROLL\EMPLOYEE_NAME:    "Peter C. Lombardi"
     DBG>

文字列値(1文字だけの場合も含む)を文字列変数に格納するには,その値を二重引用符(") か一重引用符(')で囲みます。次に例を示します。

     DBG> DEPOSIT PART_NUMBER = "WG-7619.3-84"
     DBG>

文字列がアドレス式の表す記憶位置に収まらない数のASCII文字(各1バイト) を持つ場合,デバッガは余分な文字を右から切り捨て,次のメッセージを発行します。

     %DEBUG-I-ISTRTRU, string truncated at or near DEPOSIT

文字列の文字数が少ない場合,デバッガはASCIIスペース文字を挿入することによってその文字列の右側の残りの文字を埋めます。

4.2.3 配列型

配列集合体全体を検査したり,1つの添字付き要素を検査したり,1つの断面( 要素の範囲)を検査したりできます。しかし,一度に値を格納できるのは1 つの要素だけです。次の例は,配列を使用した代表的な操作を示しています。

次のコマンドは,1次元の整数配列である配列変数ARRXの全要素の値を表示します。

     DBG> EXAMINE ARRX
     MOD3\ARRX
         (1):     42
         (2):     17
         (3):    278
         (4):     56
         (5):    113
         (6):    149
     DBG>

次のコマンドは,配列ARRXの要素4の値を表示します。言語に応じて,添字付き要素を表すために括弧または大括弧が使用されます。

     DBG> EXAMINE ARRX(4)
     MOD3\ARRX(4):   56
     DBG>

次のコマンドは,ARRXの1つの断面における全要素の値を表示します。この断面は要素2 〜要素5の要素範囲で構成されます。

     DBG> EXAMINE ARRX(2:5)
     MOD3\ARRX
         (2):     17
         (3):    278
         (4):     56
         (5):    113
     DBG>

通常,検査する値の範囲は2つの値をコロンで区切って示します(value1:value2) 。言語によっては,コロンの代わりに2つのピリオド(..) を使用できます。

一度に値を格納できる配列要素は1つだけです。1つのDEPOSITコマンドで配列断面または配列集合体全体へ値を格納することはできません。 たとえば, 次のコマンドは値53をARRXの要素2へ格納します。

     DBG> DEPOSIT ARRX(2) = 53
     DBG>

次のコマンドは,実数の2次元配列(1次元あたり3つ)である配列REAL_ ARRAYの全要素の値を表示します。

     DBG> EXAMINE REAL_ARRAY
     PROG2\REAL_ARRAY
        (1,1):       27.01000
        (1,2):       31.00000
        (1,3):       12.48000
        (2,1):       15.08000
        (2,2):       22.30000
        (2,3):       18.73000
     DBG>

境界外の添字値へ格納しようとした場合,デバッガは診断メッセージを発行します。 次に例を示します。

     DBG> DEPOSIT REAL_ARRAY(1,4) = 26.13
     %DEBUG-I-SUBOUTBND, subscript 2 is out of bounds, value is 4,
     bounds are 1..3
     DBG>

上記の例では,診断メッセージのレベルがIですので,格納操作が実行されました。 このことは,(1,3)に隣接した配列要素,(2,1)の値が境界外の格納操作によって影響を受けた可能性があることを意味します。

ある配列の複数の構成要素に同じ値を格納するには,FORまたはREPEATなどのループ・ コマンドを使用できます。たとえば,値REDを配列COLOR_ ARRAYの要素1〜要素4へ代入するには次のようにします。

     DBG> FOR I = 1 TO 4 DO (DEPOSIT COLOR_ARRAY(I) = RED)
     DBG>

配列要素を1ステップずつ処理するには,第4.1.8項で説明したとおり, 組み込みシンボルの(.)と(^)も使用できます。

4.2.4 レコード型


注意
ここでは,異質なデータ型を要素として持つデータ構造を総称して レコードという用語を使用しますが, これはC言語ではstruct型と呼ばれます。

レコード集合体全体を検査したり,1つのレコード構成要素を検査したり, 複数の構成要素を検査したりできます。しかし,一度に値を格納できる構成要素は1 つだけです。次の例は,レコードの代表的な操作を示しています。

次のコマンドはレコード変数PARTの全構成要素の値を表示します。

     DBG> EXAMINE PART
     INVENTORY\PART:
         ITEM:     "WF-1247"
         PRICE:     49.95
         IN_STOCK:  24
     DBG>

次のコマンドは一般的な構文で,レコードPARTの構成要素IN_STOCKの値を表示します。

     DBG> EXAMINE PART.IN_STOCK
     INVENTORY\PART.IN_STOCK: 24
     DBG>

次のコマンドは,上と同じレコード構成要素の値をCOBOL構文を使用して表示します。 言語をCOBOLに設定しなければなりません。

     DBG> EXAMINE IN_STOCK OF PART
     INVENTORY\IN_STOCK of PART:
         IN_STOCK:  24
     DBG>

次のコマンドはレコードPARTの2つの構成要素の値を表示します。

     DBG> EXAMINE PART.ITEM, PART.IN_STOCK
     INVENTORY\PART.ITEM:     "WF-1247"
     INVENTORY\PART.IN_STOCK:  24
     DBG>

次のコマンドはレコード構成要素IN_STOCKに値を格納します。

     DBG> DEPOSIT PART.IN_STOCK = 17
     DBG>

4.2.5 ポインタ(アクセス)型

ポインタ変数によって指定される(指し示される)要素を検査し,その要素に値を格納することができます。 また,ポインタ変数を検査することもできます。

たとえば,次のPascalコードは,実数型の値を指し示すポインタ変数 Aを宣言します。

        .
        .
        .
     TYPE
          T = ^REAL;
     VAR
          A : T;
        .
        .
        .

次のコマンドは,ポインタ変数Aによって指し示される要素の値を表示します。

     DBG> EXAMINE A^
     MOD3\A^:  1.7
     DBG>

次の例では,Aによって指し示される要素へ値3.9が格納されます。

     DBG> DEPOSIT A^ = 3.9
     DBG> EXAMINE A^
     MOD3\A^:  3.9
     DBG>

ポインタ変数の名前をEXAMINEコマンドに指定する場合,デバッガはその変数が指し示すオブジェクトのメモリ・ アドレスを表示します。次に例を示します。

     DBG> EXAMINE/HEXADECIMAL A
     SAMPLE\A: 0000B2A4
     DBG>

4.3 命令の検査と値の格納

ベクタ命令についての詳しい説明は,第16章を参照してください。 (VAXのみ)

デバッガは命令に対応したアドレス式を認識します。これにより,変数の場合と同じ基本的な手法を使用して命令を検査し, そこに値を格納することができます。

命令レベルでデバッグを行う場合,最初に次のコマンドを入力すると便利な場合があります。 このコマンドは省略時のステップ・モードを命令ごとのステップ実行に設定します。

     DBG> SET STEP INSTRUCTION
     DBG>

これ以外にも,特定の種類の命令に対してプログラムを実行できるステップ・ モードがあります。これらの命令で実行に割り込みをかけるためにブレークポイントを設定することもできます。

さらに,ユーザ・プログラムのデコード済み命令ストリームを表示するために, 画面モード機械語命令ディスプレイ(第7.4.4項を参照)を使用できます。

4.3.1 命令の検査

命令に対応したアドレス式(行番号など)をEXAMINEコマンドの中に指定した場合, デバッガはその記憶位置にある最初の命令を表示します。その後, 第4.1.8項で説明したとおり, 現在と次と前の命令( 論理要素)をそれぞれ表示するためにピリオド(.)とReturn キーとサーカンフレックス(^)を使用できます。

たとえば,Alphaプロセッサでは次のとおりです

     DBG> EXAMINE %LINE 12
     MOD3\%LINE 12:     BIS     R31,R31,R2
     DBG> EXAMINE <Return>
     MOD3\%LINE 12+4:   BIS     R31,R2,R0  ! 次の命令。
     DBG> EXAMINE <Return>
     MOD3\%LINE 12+8:   ADDL    R31,R0,R0  ! 次の命令。
     DBG> EXAMINE ^
     MOD3\%LINE 12+4:   BIS     R31,R2,R0  ! 次の命令。
     DBG>

行番号,ルーチン名,およびラベルは,命令に対応づけられるシンボリック・ アドレス式です。また,命令はプログラムの実行時に他の各種のメモリ・ アドレスや一定のレジスタに格納される場合があります。

プログラム・カウンタ(PC)は,プログラムが次に実行する命令のアドレスが入っているレジスタです。EXAMINE .%PC コマンドはその命令を表示します。 ピリオド(.)は,アドレス式の直前に使用した場合には"内容"演算子( アドレス式が指し示す記憶位置の内容)を表します。次の違いに注意してください。

VAXプロセッサでは,EXAMINE .%PCコマンドを入力した場合に表示される情報の量を制御するために/OPERANDS 修飾子を使用できます。

     DBG> EXAMINE .%PC
     MOD3\%LINE 12:       MOVL    B^12(R11),R1
     DBG> EXAMINE/OPERANDS .%PC
     MOD3\%LINE 12:       MOVL    B^12(R11),R1
          B^12(R11)  MOD3\K (address 1196) contains 1
          R1         R1 contains 8
     DBG> EXAMINE/OPERANDS=FULL .%PC
     MOD3\%LINE 12:       MOVL    B^12(R11),R1
          B^12(R11)  R11 contains MOD3\N (address 1184), B^12(1184) evaluates to
                     MOD3\K (address 1196), which contains 1
          R1         R1 contains 8
     DBG>

VAXプロセッサでは,/OPERANDS修飾子は,現在のPC命令を検査する場合にだけ使用します。 他の記憶位置を指定したときには,情報が正確でない場合があります。SET MODE [NO]OPERANDS コマンドを使用すると,EXAMINE .%PCコマンドの省略時の動作を制御することができます。

前の例に示したとおり,デバッガはアドレス式が命令に対応しているかどうかを認識しています。 対応している場合,EXAMINEコマンドはその命令を表示します。/INSTRUCTION 修飾子を使用する必要はありません。 /INSTRUCTION修飾子は,任意のプログラム記憶位置の内容を命令として表示するために使用します。 つまり,EXAMINE/INSTRUCTIONコマンドを使用すると, デバッガはあらゆるプログラム記憶位置の内容を命令として解釈し編集します( 第4.5.2項を参照)。

MACRO-32プログラム内の連続した命令を検査する場合,データの記憶域が命令ストリームの中間に割り当てられていると, デバッガがデータを命令と誤って解釈することがあります。 次の例はこの問題を説明したものです。 このMACRO-32コードでは,行7のBRB命令の直後に2つのロングワード・ データ記憶域が割り当てられています。行番号は説明のために加えたものです。

     module TEST
          1:         .TITLE  TEST
          2:
          3: TEST$START::
          4:         .WORD   0
          5:
          6:         MOVL    #2,R2
          7:         BRB     LABEL_2
          8:
          9:         .LONG   ^X12345
         10:         .LONG   ^X14465
         11:
         12: LABEL_2:
         13:         MOVL    #5,R5
         14:
         15:         .END    TEST$START

次のEXAMINEコマンドは行6の開始時の命令を表示します。

     DBG> EXAMINE %LINE 6
     TEST\TEST$START\%LINE 6:  MOVL    S^#02,R2
     DBG>

次のEXAMINEコマンドは,行7で論理的後続データ要素を正しく解釈し,表示します。

     DBG> EXAMINE <Return>
     TEST\TEST$START\%LINE 7:  BRB     TEST\TEST$START\LABEL_2
     DBG>

しかし,次の3つのEXAMINEコマンドは,3つの論理的後続データを誤って命令として解釈します。

     DBG> EXAMINE <Return>
     TEST\TEST$START\%LINE 7+2:  MULF3   S^#11.00000,S^#0.5625000,S^#0.5000000
     DBG> EXAMINE <Return>
     %DEBUG-W-ADDRESSMODE, instruction uses illegal or undefined addressing modes
     TEST\TEST$START\%LINE 7+6:  MULD3   S^#0.5625000[R4],S^#0.5000000,@W^5505(R0)
     DBG> EXAMINE <Return>
     TEST$START+12:   HALT
     DBG>

4.3.2 命令への値の格納(VAXのみ)

VAXプロセッサでは,命令を検査するだけでなく, そこに値を格納することもできます。次のDEPOSITコマンド構文を使用します。

     DEPOSIT/INSTRUCTION address-expression = "language-expression"

命令は,二重引用符または一重引用符で囲まなければなりません。また, この区切り文字の付いた文字列がASCII文字列ではなく命令であることを示すため,DEPOSIT コマンドといっしょに/INSTRUCTION修飾子も使用しなければなりません。 あるいは,複数の命令を格納する場合には,最初にSET TYPE/OVERRIDE INSTRUCTION コマンドを入力することができます( 第4.5.2項を参照)。そのようにすれば, DEPOSITコマンドで/INSTRUCTION修飾子を使用する必要がなくなります。

命令が占有するバイト数はオペランドによって異なります。任意の長さの命令を連続したメモリ記憶位置へ格納する場合, 命令を格納できる次の未使用記憶位置を設定するためには論理的後続データ演算子(Return キー)を使用します。 次の例はその手法を示しています。

     DBG> SET TYPE/OVERRIDE/INST      ! 命令に省略時の型を設定する。
     DBG> DEPOSIT 730 = "MOVB #77, R1"! 命令をアドレス 730 から格納する。
     DBG> EXAMINE .                   ! 格納を確認するため,現在の値を検査する。
     730:  MOVB  #77,R1
     DBG> EXAMINE <RET>               ! 論理的後続データを新しい現在の値にする。
     734:  HALT
     DBG> DEPOSIT . = "MOVB #66, R2"  ! 次の命令を格納する。
     DBG> EXAMINE .                   ! 格納を表示し確認する。
     734:  MOVB  #66,R2
     DBG>

命令を置換する場合,新しい命令の長さがオペランドも含めて古い命令と同じバイト数であることを確認してください。 新しい命令のほうが長い場合は, その格納は必ず重ね書きによって行われるので,次の命令が破壊されてしまいます。 新しい命令が古い命令より短い場合には,置換後に未使用のまま残ったメモリのバイトにNOP 命令(ノー・オペレーション命令)を格納しなければなりません。 デバッガは,格納する命令が次の命令に重ね書きされる場合でも警告を出すこともなく, またメモリ内の空のバイトをNOP で埋めるように注意を喚起することもありません。

次の例は,命令を同じ長さの命令で置換する方法を示しています。

     DBG> SET STEP INSTRUCTION         ! 命令ごとにステップ実行する。
     DBG> STEP
     stepped to 1584: PUSHAL  (R11)
     DBG> STEP
     stepped to 1586: CALLS  #1,L^2224 ! 置き換えたい命令。
     DBG> EXAMINE .%PC
     1586: CALLS  #1,L^2224
     DBG> EXAMINE <Return>             ! 次の命令の開始点を
     1593:  CALLS   #0,L^2216          ! 判別する (1593)。
     DBG> DEPOSIT/INST 1586 = "CALLS  #2,L^2224"
                                       ! 新しい命令を格納する。
     DBG> EXAMINE .                    ! その命令が格納されたことを
     1586:  CALLS   #2,L^2224          ! 確認する。
     DBG> EXAMINE <Return>             ! 次の命令が
     1593:  CALLS   #0,L^2216          ! 変更されていないことを確認する。
     DBG>

4.4 レジスタの検査と値の格納

VAXアーキテクチャが16個の汎用レジスタと18個のベクタ・レジスタを備えており, それらの一部は一時的なアドレスやデータの記憶域として使用されます。 表 4-1に,VAXレジスタを参照するデバッガ組み込みシンボルを示します。

表 4-1 VAXレジスタ用のデバッガ・シンボル

シンボル 説明
VAXの汎用レジスタ
%R0 . . . %R11 汎用レジスタ(R0 . . . R11)
%AP (%R12) 引数ポインタ(AP)
%FP (%R13) フレーム・ポインタ(FP)
%SP (%R14) スタック・ポインタ(SP)
%PC (%R15) プログラム・カウンタ(PC)
%PSL プロセッサ・ステータス・ロングワード(PSL)
VAXのベクタ・レジスタおよびベクタ制御レジスタ
%V0 . . . %V15 ベクタ・レジスタV0 . . . V15
%VCR ベクタ数レジスタ
%VLR ベクタ長レジスタ
%VMR ベクタ・マスク・レジスタ

VAXプロセッサには次のことが該当します。

Alphaプロセッサでは,Alphaアーキテクチャが32 個の汎用(整数)レジスタと32個の浮動小数点レジスタを備えており,それらの一部は一時的なアドレスやデータの記憶域として使用されます。 表 4-2に,Alphaプロセッサ・ レジスタを参照するデバッガ組み込みシンボルを示します。

表 4-2 Alphaレジスタ用のデバッガ・シンボル

シンボル 説明
Alphaの整数レジスタ
%R0 . . . %R28 レジスタR0 . . . R28
%FP (%R29) スタック・ フレーム基底レジスタ(FP)
%SP (%R30) スタック・ポインタ(SP)
%R31 ReadAsZero/Sink (RZ)
%PC プログラム・カウンタ(PC)
%PS プロセッサ・ステータス・レジスタ(PS)(Alpha プロセッサの場合,組み込みシンボルの%PSL と%PSWは使用できない)
Alphaの浮動小数点レジスタ
%F0 . . . %F30 レジスタF0 . . . F30
%F31 ReadAsZero/Sink

Alphaプロセッサには次のことが該当します。

次の例はレジスタの検査とそこに値を格納する方法を示しています。

     DBG> SHOW TYPE          ! コンパイラ生成型を持たない
     type: long integer      ! 記憶位置の型を表示する。
     DBG> SHOW RADIX         ! 現在の基数を表示する。
     input radix: decimal
     output radix: decimal
     DBG> EXAMINE %R11       ! R11 内の値を表示する。
     MOD3\%R11:  1024
     DBG> DEPOSIT %R11 = 444 ! R11 に新しい値を格納する。
     DBG> EXAMINE %R11       ! 新しい値をチェックする。
     R11:  444
     DBG> EXAMINE %PC        ! プログラム・カウンタ内の値を表示する。
     MOD\%PC: 1553
     DBG> EXAMINE %SP        ! スタック・ポインタ内の値を表示する。
     0\%SP:  2147278720
     DBG>

PCについての詳しい説明は第4.3.1項を参照してください。

4.4.1 プロセッサ・ステータス・ロングワード(VAX のみ)

VAXプロセッサでは,プロセッサ・ステータス・ ロングワード(PSL)レジスタの値がプロセッサ・ステータス変数の数を表します。PSL の最初の16ビット(この16ビットをプロセッサ・ステータス・ ワードまたはPSWという)には,現在のプロセッサ・ステータスに関する非特権情報が入っています。 これらのビットの値はユーザ・プログラムによって制御できます。PSL の残りの16ビット(ビット16〜31)には特権情報が入っており, ユーザ・モード・プログラムでは変更できません。

次の例はPSLの内容を検査する方法を示しています。

     DBG> EXAMINE %PSL
     MOD3\PSL:
           CMP TP FPD IS CURMOD PRVMOD IPL DV FU IV T N Z V C
            n   n  n   n  mode   mode   1v  n  n  n n n n n n
     DBG>

各ビットの値も含めたPSLについての完全な説明は,『VAX Architecture Handbook』を参照してください。

PSL内の情報は別の形式でも表示できます。次に例を示します。

     DBG> EXAMINE/LONG/HEX %PSL
     MOD3\%PSL:        03C00010
     DBG> EXAMINE/LONG/BIN %PSL
     MOD3\%PSL:        00000011 11000000 00000000 00010000
     DBG>

EXAMINE/PSLコマンドは,記憶位置の値をPSL形式で表示します。これは, 呼び出しスタック上の保存されたPSLを検査するのに役立ちます。

PSL内のすべての条件を禁止するには,次のDEPOSITコマンドを使用してビット0 〜15をクリアします。

     DBG> DEPOSIT/WORD PSL = 0
     DBG> EXAMINE/PSL
     MOD3\PSL:
           CMP TP FPD IS CURMOD PRVMOD IPL DV FU IV T N Z V C
            0   0  0   0  USER   USER   0   0  0  0 0 0 0 0 0
     DBG>

4.4.2 プロセッサ・ステータス(Alphaのみ)

Alphaプロセッサでは,プロセッサ・ステータス(PS) レジスタの値がプロセッサ・ステータス変数の数を表します。PS の最初の3ビットは,このソフトウェアが使用するために予約されています。 これらのビットの値はユーザ・プログラムで制御できます。残りのビット( ビット4〜64)には特権情報が入っており,ユーザ・モード・プログラムでは変更できません。

次の例はPSの内容を検査する方法を示しています。

     DBG> EXAMINE %PS
     MOD1\%PS:
           SP_ALIGN IPL VMM   CM   IP SW
              48     0   0   USER   0  3
     DBG>

各ビットの値も含めたPSについての完全な説明は,『Alpha Architecture Reference Manual』を参照してください。

PS内の情報は別の形式でも表示できます。次に例を示します。

     DBG> EXAMINE/LONG/HEX %PS
     MOD1\%PS:        0000001B
     DBG> EXAMINE/LONG/BIN %PS
     MOD1\%PS:        00000000 00000000 00000000 00011011
     DBG>

EXAMINE/PSコマンドは,記憶位置の値をPS形式で表示します。これは,現在のPS 値と保存されたPS値の組み合わせを検査するのに役立ちます。

4.5 検査と格納を行う場合の型の指定

ここまでの節では,シンボリック名を持ち,したがってコンパイラ生成型に対応しているプログラム記憶位置をEXAMINE コマンドとDEPOSITコマンドで使用する方法を説明しました。

第4.5.1項では,シンボリック名を持たないプログラム記憶位置用にデバッガがデータを編集( 型指定)する方法と,それらの記憶位置用に型を制御する方法を説明します。

第4.5.2項では,プログラム記憶位置に対応した型を上書きする方法を, シンボリック名を持つ記憶位置も含めて説明します。

4.5.1 シンボリック名を持たないプログラム記憶位置に対する型の定義

シンボリック名を持たず,したがってコンパイラ生成型に対応付けられていないプログラム記憶位置は, 省略時の設定ではロングワード整数型を持ちます。 この省略時の型を使用してそれらの記憶位置を検査し,それらの記憶位置へ値を格納する方法については, 第4.1.5 項を参照してください。

SET TYPEコマンドを使用すると,省略時の型を変更できます。これは, 別の型の記憶位置の内容を検査および表示したい場合や,特定の型の値を別の型に対応付けられた記憶位置へ格納したい場合に役立ちます。 表 4-3は,SET TYPEコマンドの型のキーワードの一覧です。

表 4-3 SET TYPEキーワード


ASCIC D_FLOAT +H_ FLOAT PACKED
ASCID DATE_TIME INSTRUCTION QUADWORD
ASCII:n ++EXTENDED_FLOAT ++LONG_FLOAT ++S_FLOAT
ASCIW F_LOAT ++LONG_LONG_FLOAT ++T_FLOAT
ASCIZ FLOAT LONGWORD TYPE=(type-expression)
BYTE G_FLOAT OCTAWORD WORD



++X_FLOAT

+ VAX固有

++ Alpha固有


たとえば,次のコマンドはシンボリック名を持たない記憶位置の型をバイト整数型,G 浮動小数点数型,6バイトのASCIIデータからなるASCII型にそれぞれ設定します。 一連のSET TYPEコマンドは型を再設定します。

     DBG> SET TYPE BYTE
     DBG> SET TYPE G_FLOAT
     DBG> SET TYPE ASCII:6

SET TYPEコマンドは,/OVERRIDE修飾子を指定せずに使用した場合,シンボリック名を持つプログラム記憶位置( コンパイラ生成型に対応付けられた記憶位置) の型には影響を及ぼさないので注意してください。

SHOW TYPEコマンドは,シンボリック名を持たない記憶位置の現在の型を表示します。 そのような記憶位置の省略時の型を復元するには,SET TYPE LONGWORDコマンドを入力します。

4.5.2 現在の型の上書き

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>

4.5.2.2 ASCII文字列型

次の例は,/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>

4.5.2.3 ユーザ宣言型

次の例は,/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>


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