Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


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                  ! 次の記憶位置 ARY(2)を検査する。
MOD3\ARY(2):   7          ! その際,ARY(1)の型を参照する。
DBG> EXAMINE                  ! 次の記憶位置 ARY(3)を検査する。
MOD3\ARY(3):  19          ! 現在の値はこの時点で ARY(3)となる。
DBG> EXAMINE                  ! 1006 の値(FLT)を検査する。
MOD3\FLT:  1.9117807E+07  ! 現在の値はこの時点で FLT となる。
DBG> EXAMINE                  ! 1010 の値(BTE)を検査する。
MOD3\BTE:   43            ! 現在の値はこの時点で BTE となる。
DBG> EXAMINE                  ! 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 にもあります。


前へ 次へ 目次 索引