HP OpenVMS Systems Documentation |
| 前へ | 次へ | 目次 | 索引 |
ここでは,異質なデータ型を要素として持つデータ構造を総称して レコード という用語を使用しますが,これは 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 コマンドはその命令を表示します。ピリオド (.) は,アドレス式の直前に使用した場合には " 内容 " 演算子 (アドレス式が指し示す記憶位置の内容) を表します。次の違いに注意してください。
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 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> |
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 [Return] ! 論理的後続データを新しい現在の値にする。 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>
|
EXAMINE コマンドは,プログラム内でアクセス可能なレジスタの内容を表示します。 DEPOSIT コマンドを使用すると,これらのレジスタの内容を変更できます。レジスタの数と種類は,次の項に示すように,各 OpenVMS プラットフォームにより異なります。
4.4.1 VAX レジスタの検査と値の格納
VAX アーキテクチャが 16 個の汎用レジスタと 18 個のベクタ・レジスタを備えており,それらの一部は一時的なアドレスやデータの記憶域として使用されます。 表 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 プロセッサには次のことが該当します。
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>
|
Alpha プロセッサでは,Alpha アーキテクチャが 32 個の汎用 (整数) レジスタと 32 個の浮動小数点レジスタを備えており,それらの一部は一時的なアドレスやデータの記憶域として使用されます。 表 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 ! 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> |
EXAMINE/PS コマンドは,記憶位置の値を PS 形式で表示します。これは,現在の PS 値と保存された PS 値の組み合わせを検査するのに役立ちます。
| 前へ | 次へ | 目次 | 索引 |