日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
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 は G 浮動小数点数型である。 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> |
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> |
ポインタ変数によって指定される ( 指し示される ) 要素を検査し,その要素に値を格納することができます。また,ポインタ変数を検査することもできます。
たとえば,次の 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> |
デバッガは命令に対応したアドレス式を認識します。これにより,変数の場合と同じ基本的な手法を使用して命令を検査し,そこに値を格納することができます。
命令レベルでデバッグを行う場合,最初に次のコマンドを入力すると便利な場合があります。このコマンドは省略時のステップ・モードを命令ごとのステップ実行に設定します。
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 MOD3\%LINE 12+4: BIS R31,R2,R0 ! 次の命令 DBG> EXAMINE MOD3\%LINE 12+8: ADDL R31,R0,R0 ! 次の命令 DBG> EXAMINE ^ MOD3\%LINE 12+4: BIS R31,R2,R0 ! 前の命令 DBG> |
行番号,ルーチン名,およびラベルは,命令に対応づけられるシンボリック・アドレス式です。また,命令はプログラムの実行時に他の各種のメモリ・アドレスや一定のレジスタに格納される場合があります。
プログラム・カウンタ (PC) は,プログラムが次に実行する命令のアドレスが入っているレジスタです。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 TEST\TEST$START\%LINE 7: BRB TEST\TEST$START\LABEL_2 DBG> |
しかし,次の 3 つの EXAMINE コマンドは,3 つの論理的後続データを誤って命令として解釈します。
DBG> EXAMINE TEST\TEST$START\%LINE 7+2: MULF3 S^#11.00000,S^#0.5625000,S^#0.5000000 DBG> EXAMINE %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 TEST$START+12: HALT DBG> |
EXAMINE コマンドは,プログラム内でアクセス可能なレジスタの内容を表示します。 DEPOSIT コマンドを使用すると,これらのレジスタの内容を変更できます。レジスタの数と種類は,次の項に示すように,各 OpenVMS プラットフォームにより異なります。
4.4.1 Alpha レジスタの検査と値の格納
Alpha プロセッサでは,Alpha アーキテクチャが 32 個の汎用 (整数) レジスタと 32 個の浮動小数点レジスタを備えており,それらの一部は一時的なアドレスやデータの記憶域として使用されます。 表 4-1 に,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 ! Show type for locations without type: long integer ! a compiler-generated type. DBG> SHOW RADIX ! Identify current radix. input radix: decimal output radix: decimal DBG> EXAMINE %R11 ! Display value in R11. MOD3\%R11: 1024 DBG> DEPOSIT %R11 = 444 ! Deposit new value into R11. DBG> EXAMINE %R11 ! Check new value. R11: 444 DBG> EXAMINE %PC ! Display value in program counter. MOD\%PC: 1553 DBG> EXAMINE %SP ! Display value in stack pointer. 0\%SP: 2147278720 DBG> |
PC についての詳細は, 第 4.3.1 項 を参照してください。
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> |
目次 | 索引 |
|