日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
本章では,任意のプログラム記憶位置の内容とプログラム内で宣言したシンボルの値を表示したり変更したりするための EXAMINE コマンドと DEPOSIT コマンドの使用法について説明します。また,言語式を評価する EVALUATE などのコマンドの使用法についても説明します。
本章には次の内容が含まれています。
本章の例には言語固有のすべての動作が含まれているわけではありません。どの言語でデバッグを行う場合でも,次の説明を必ず参照してください。
この節では EXAMINE,DEPOSIT,EVALUATE の各コマンドを紹介し,これらのコマンドに共通した概要を説明します。
非静的 ( スタック・ローカルまたはレジスタ ) 変数を検査したり,そこに値を格納したりするには,その変数を定義しているルーチンが呼び出しスタック上でアクティブでなければなりません。すなわち,定義しているルーチン内のどこかでプログラムの実行が一時停止していなければなりません。非静的変数についての詳しい説明は, 第 3.4.3 項 を参照してください。
静的変数はプログラム実行中にいつでも検査でき,非静的変数は,それを定義しているルーチンへ到達したときに検査できます。しかし,変数を検査する前に,それが宣言され初期化されている場所を越えてプログラムを実行するようにしてください。初期化されていない変数に含まれる値は無効とみなさなければなりません。
多くのコンパイラでは,プログラムの実行速度を向上させるためにコードを最適化します。デバッグ中のコードが最適化されたものである場合は,プログラム記憶位置がソース・コードから予想したものと一致しないことがあります。特に,最適化技法の中には,特定の変数を排除するものがあるので,デバッグ時にそれらの変数へはアクセスできなくなります。
第 14.1 節 には,実行可能コードに対するいくつかの最適化技法の効果が説明されています。最初にプログラムをデバッグする場合は,できれば /NOOPTIMIZEまたはそれに相当するコンパイラ・コマンド修飾子を使用して最適化を禁止するのが最善の方法です。
EXAMINE コマンドまたは DEPOSIT コマンドを変数名,またはその他のシンボリック・アドレス式といっしょに使用する場合,モジュールの設定や有効範囲かパス名の指定が必要になることがあります。それらの概念は 第 5 章 で説明します。本章の例では,すべてのモジュールが設定され,すべての変数名が固有に定義されることと想定しています。
高級言語プログラムでは,EXAMINE コマンドはほとんどの場合,変数の現在の値を表示するために使用され,次の構文をとります。
4.1 概要
4.1.1 デバッグ時の変数へのアクセス
注意
ここでは総称して非静的変数という用語を使用しますが,ある言語では自動変数と呼ぶ場合もあります。
4.1.2 EXAMINE コマンドの使用
EXAMINE address-expression[,...] |
たとえば次のコマンドは整変数 X の現在の値を表示します。
DBG> EXAMINE X MOD3\X: 17 DBG> |
値を表示する場合,デバッガは変数名の前にパス名 ( この場合は変数 X が宣言されているモジュールの名前 ) を付けます ( 第 5.3.2 項 を参照 )。
一般的には,EXAMINE コマンドはアドレス式で表された要素の現在の値を,その記憶位置に対応づけられた型 ( たとえば,整数,実数,配列,レコードなど ) で表示します。
EXAMINE コマンドを入力すると,デバッガはプログラム記憶位置 ( メモリ・アドレスまたはレジスタ ) を得るためにアドレス式を評価します。その後,デバッガはその記憶位置に格納されている値を次のように表示します。
シンボリック・アドレス式および非シンボリック・アドレス式に対応する型についての詳しい説明は, 第 4.1.5 項 を参照してください。
省略時の設定では,デバッガは値を表示する場合にシンボル情報が入手できるのであれば,アドレス式とそのパス名をシンボルによって示します。アドレスのシンボル化についての詳しい説明は 第 4.1.11 項 を参照してください。
デバッガは,次のように wchar_t 変数を直接検査することができます。
DBG> EXAMINE wide_buffer TST\main\wide_buffer[0:31]: 'test data line 1................' |
Integrity サーバ上の OpenVMS Debugger は,レジスタ・リネーム・ベース (CFM.rrb) とローテート・サイズ (CFM.sor) が両方ゼロであるかのように汎用レジスタ,浮動小数点レジスタ,およびプリディケート・レジスタを表示します。つまり,ローテーションしようとしているレジスタが使用中の場合,そのローテーションは無視されます。
注意 このような状況は,C++ やアセンンブリング言語プログラムで稀に発生することがあります。ほとんどのプログラムは影響を受けません。 |
このような場合は,CFM レジスタを検査し,ゼロでない CFM.rrb および CFM.sor フィールドを検査するように EXAMINE コマンドを手動で調整します。
4.1.3 DUMP コマンドの使用
DCL の DUMP コマンドと同じ方法でメモリの内容を表示するには,次のいずれかの形式でデバッガの DUMP コマンドを使用します。
Binary
Byte
Decimal
Hexadecimal
Longword (省略時の設定)
Octal
Quadword
Word
DUMP コマンドの構文は次のとおりです。
DUMP address-expression1[:address-expression2] |
address-expression2 の省略時の設定は address-expression1 です。たとえば,次のコマンドはレジスタ R16〜R25 の現在の値をクォドワード形式で表示します。
DBG> DUMP/QUADWORD R16:R25 0000000000000078 0000000000030038 8.......x....... %R16 000000202020786B 0000000000030041 A.......kx ... %R18 0000000000030140 0000000000007800 .x......@....... %R20 0000000000010038 0000000000000007 ........8....... %R22 0000000000000006 0000000000000000 ................ %R24 DBG> |
DUMP コマンドを使用すると,レジスタ,変数,配列の内容を表示できます。デバッガは配列の構造体を解釈しません。次の修飾子は,デバッガが DUMP コマンドからの出力を表示する方法を指定します。
修飾子 | 出力の形式 |
---|---|
/BINARY | 2 進整数 |
/BYTE | 1 バイトの整数 |
/DECIMAL | 10 進整数 |
/HEXADECIMAL | 16 進整数 |
/LONGWORD | ロングワード整数 (4 バイト長) |
/OCTAL | 8 進整数 |
/QUADWORD | クォドワード整数 (8 バイト長) |
/WORD | ワード整数 (2 バイト長) |
省略時の設定では,デバッガは,確認した値がコンパイラで生成されるデータ型でない場合,それをロングワードとして表示します。
4.1.4 DEPOSIT コマンドの使用
高級言語では,DEPOSIT コマンドはほとんどの場合,変数に新しい値を代入するために使用されます。このコマンドは,多くのプログラミング言語の代入文と似ていて,次の構文をとります。
DEPOSIT address-expression = language-expression |
たとえば次の DEPOSIT コマンドは整変数 X に値 23 を代入します。
DBG> EXAMINE X MOD3\X: 17 DBG> DEPOSIT X = 23 DBG> EXAMINE X MOD3\X: 23 DBG> |
一般的には,DEPOSIT コマンドは言語式を評価し,その結果の値をアドレス式で表されたプログラム記憶位置に格納します。
DEPOSIT コマンドを入力すると,デバッガは次のことを行います。
その言語の規則で許されていれば,デバッガは格納操作時に型変換を行うことがあるので注意してください。たとえば,X が整変数である場合,次の例では実数値 2.0 は整数値 2 へ変換され,その後で X に代入されます。
DBG> DEPOSIT X = 2.0 DBG> EXAMINE X MOD3\X: 2 DBG> |
通常,デバッガは現在の言語の代入規則に従おうとします。
4.1.5 アドレス式とそれに対応した型
プログラム内で宣言したシンボル (変数名,ルーチン名など) は,シンボリック・アドレス式です。それらはメモリ・アドレスかレジスタを表します。シンボリック・アドレス式 (本章では「シンボリック名」とも呼ぶ) はコンパイラ生成型を持ち,デバッガはシンボリック名に対応する型と記憶位置が分かっています。シンボリック名からメモリ・アドレスとレジスタ名を取得する方法と,プログラム記憶位置をシンボル化する方法については, 第 4.1.11 項 を参照してください。
シンボリック名には次のカテゴリがあります。
シンボリック名を持たないプログラム記憶位置は,コンパイラ生成型に対応づけられません。そのような記憶位置を検査したりそこに値を格納したりできるようにするため,デバッガはそれらの記憶位置を省略時の型であるロングワード整数へ対応づけます。シンボリック名を持たない記憶位置を指定した場合には, EXAMINE コマンドは指定されたアドレスから始まる 4 バイトの内容を表示し,表示される情報を整数値として編集します。次の例では,メモリ・アドレス 926 はシンボリック名に対応づけられていません (EXAMINE コマンドを実行した場合,このアドレスはシンボル化されないことに注意してください)。したがって, EXAMINE コマンドはそのアドレスの値をロングワード整数として表示します。
DBG> EXAMINE 926 926: 749404624 DBG> |
省略時の設定では,シンボリック名を持たないプログラム記憶位置へ最高 4 バイトの整数データを格納できます。このデータはロングワード整数として編集されます。次に例を示します。
DBG> DEPOSIT 926 = 84 DBG> EXAMINE 926 926: 84 DBG> |
シンボリック名を持たない記憶位置を検査する方法とそこへ値を格納する方法については, 第 4.5 節 で説明します。
EXAMINE コマンドと DEPOSIT コマンドには型修飾子 ( /ASCII:n,/BYTE など ) が使用でき,これらを使用すればプログラム記憶位置と対応した型を上書きすることができます。これは,記憶位置の内容を別の型で解釈し表示する場合や,特定の型の値を別の型に対応づけられた記憶位置に格納したい場合のどちらにも役立ちます。型を上書きする方法については 第 4.5 節 で説明します。
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> |
言語式内では,プログラムのソース・コード内で変数を使用するのとほぼ同じように変数を使用できます。
したがって,デバッガは通常,言語式内で使用された変数をその変数のアドレスとしてではなく,その変数の現在の値として解釈します。次に例を示します (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 に設定してある場合,どちらもアドレス式のアドレスを表示します。
目次 | 索引 |
|