Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


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 項 を参照)を使用できます。


前へ 次へ 目次 索引