library home hp.com home products and services support and drivers solutions
cd-rom home
End of Jump to page title
HP OpenVMS Systems
Documentation

Jump to content


HP OpenVMS

HP OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


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 命令の検査と値の格納

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

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


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> 

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 [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> 

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

EXAMINE コマンドは,プログラム内でアクセス可能なレジスタの内容を表示します。 DEPOSIT コマンドを使用すると,これらのレジスタの内容を変更できます。レジスタの数と種類は,次の項に示すように,各 OpenVMS プラットフォームにより異なります。

4.4.1 VAX レジスタの検査と値の格納

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 プロセッサには次のことが該当します。

プロセッサ・ステータス・ロングワード (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 プロセッサでは,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          ! 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 のみ)

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 値の組み合わせを検査するのに役立ちます。


前へ 次へ 目次 索引