日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 部:デバッガ概要
第 1 章:デバッガ概要
第 2 部:コマンド・インタフェース
第 2 章:デバッガの起動
第 3 章:プログラム実行の制御とモニタ
第 4 章:プログラム・データの検査と操作
第 5 章:プログラム内シンボルへのアクセス制御
第 6 章:ソース・コードの表示の制御
第 7 章:画面モード
第 3 部:DECwindows インタフェース
第 8 章:DECwindows Motifインタフェースの概要
第 9 章:デバッグ・セッションの開始と終了
第 10 章:デバッガの使用方法
第 4 部:PC クライアント・インタフェース
第 11 章:デバッガの PC クライアント/サーバ・インタフェースの概要
第 5 部:高度なトピック
第 12 章:ヒープ・アナライザの使用
第 13 章:その他の便利な機能
第 14 章:特殊なデバッグ
第 15 章:マルチプロセス・プログラムのデバッグ
第 16 章:タスキング・プログラムのデバッグ
第 6 部:付録
付録 A :定義済みのキー機能
付録 B :組み込みシンボルと論理名
付録 C :各言語に対するデバッガ・サポートの要約
付録 D :EIGHTQUEENS.C
索引
PDF
OpenVMS ホーム

HP OpenVMS
デバッガ説明書


目次 索引

第 4 章
プログラム・データの検査と操作

本章では,任意のプログラム記憶位置の内容とプログラム内で宣言したシンボルの値を表示したり変更したりするための EXAMINE コマンドと DEPOSIT コマンドの使用法について説明します。また,言語式を評価する EVALUATE などのコマンドの使用法についても説明します。

本章には次の内容が含まれています。

  • EXAMINE,DEPOSIT,EVALUATE の各コマンドの使用に関連した概要。

  • シンボリック名 ( たとえば,プログラム内で宣言した変数名やルーチン名など ) を伴うコマンドの使用。そのようなシンボリック・アドレス式はコンパイラ生成型に対応づけられる。

  • シンボリック名を持たず,プログラム記憶位置 ( メモリ・アドレスまたはレジスタ ) を伴うコマンドの使用。そのようなアドレス式はコンパイラ生成型には対応づけられない。

  • アドレス式に対応づけられた型を上書きするための型の指定。

本章の例には言語固有のすべての動作が含まれているわけではありません。どの言語でデバッグを行う場合でも,次の説明を必ず参照してください。

  • 第 14.3 節 。ここでは,複数言語プログラムをデバッグする場合に注意しなければならない重要な言語の相違点を詳しく説明している。

  • デバッガのオンライン・ヘルプ (HELP Language と入力する)。

  • その言語といっしょに提供されたドキュメント。



4.1 概要

この節では EXAMINE,DEPOSIT,EVALUATE の各コマンドを紹介し,これらのコマンドに共通した概要を説明します。

4.1.1 デバッグ時の変数へのアクセス

  注意
ここでは総称して非静的変数という用語を使用しますが,ある言語では自動変数と呼ぶ場合もあります。

非静的 ( スタック・ローカルまたはレジスタ ) 変数を検査したり,そこに値を格納したりするには,その変数を定義しているルーチンが呼び出しスタック上でアクティブでなければなりません。すなわち,定義しているルーチン内のどこかでプログラムの実行が一時停止していなければなりません。非静的変数についての詳しい説明は, 第 3.4.3 項 を参照してください。

静的変数はプログラム実行中にいつでも検査でき,非静的変数は,それを定義しているルーチンへ到達したときに検査できます。しかし,変数を検査する前に,それが宣言され初期化されている場所を越えてプログラムを実行するようにしてください。初期化されていない変数に含まれる値は無効とみなさなければなりません。

多くのコンパイラでは,プログラムの実行速度を向上させるためにコードを最適化します。デバッグ中のコードが最適化されたものである場合は,プログラム記憶位置がソース・コードから予想したものと一致しないことがあります。特に,最適化技法の中には,特定の変数を排除するものがあるので,デバッグ時にそれらの変数へはアクセスできなくなります。

第 14.1 節 には,実行可能コードに対するいくつかの最適化技法の効果が説明されています。最初にプログラムをデバッグする場合は,できれば /NOOPTIMIZEまたはそれに相当するコンパイラ・コマンド修飾子を使用して最適化を禁止するのが最善の方法です。

EXAMINE コマンドまたは DEPOSIT コマンドを変数名,またはその他のシンボリック・アドレス式といっしょに使用する場合,モジュールの設定や有効範囲かパス名の指定が必要になることがあります。それらの概念は 第 5 章 で説明します。本章の例では,すべてのモジュールが設定され,すべての変数名が固有に定義されることと想定しています。

4.1.2 EXAMINE コマンドの使用

高級言語プログラムでは,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 コマンドを入力すると,デバッガは次のことを行います。

  • プログラム記憶位置を得るためにアドレス式を評価する。

  • プログラム記憶位置にシンボリック名がある場合,デバッガはその記憶位置をそのシンボルのコンパイラ生成型に対応づける。記憶位置にシンボリック名がない場合,デバッガは,省略時の設定では,その記憶位置をロングワード整数型に対応づける ( 第 4.1.5 項 を参照 )。

  • 値を得るため,現在の言語の構文および現在の基数で言語式を評価する。この動作は EVALUATE コマンドの動作と同じである ( 第 4.1.6 項 を参照 )。

  • 言語式の値と型がアドレス式の型と適合するかどうかを調べる。アドレス式の型と互換性のない値を格納しようとした場合,デバッガは診断メッセージを発行する。値が互換性を持つ場合,デバッガはその値をアドレス式で表された記憶位置に格納する。

その言語の規則で許されていれば,デバッガは格納操作時に型変換を行うことがあるので注意してください。たとえば,X が整変数である場合,次の例では実数値 2.0 は整数値 2 へ変換され,その後で X に代入されます。

DBG> DEPOSIT X = 2.0
DBG> EXAMINE X
MOD3\X:   2
DBG>

通常,デバッガは現在の言語の代入規則に従おうとします。

4.1.5 アドレス式とそれに対応した型

プログラム内で宣言したシンボル (変数名,ルーチン名など) は,シンボリック・アドレス式です。それらはメモリ・アドレスかレジスタを表します。シンボリック・アドレス式 (本章では「シンボリック名」とも呼ぶ) はコンパイラ生成型を持ち,デバッガはシンボリック名に対応する型と記憶位置が分かっています。シンボリック名からメモリ・アドレスとレジスタ名を取得する方法と,プログラム記憶位置をシンボル化する方法については, 第 4.1.11 項 を参照してください。

シンボリック名には次のカテゴリがあります。

  • 変数
    対応するプログラム記憶位置には変数の現在の値が入っています。変数を検査する方法とそこに値を格納する方法については, 第 4.2 節 で説明します。

  • ルーチン,ラベル,行番号
    対応するプログラム記憶位置には命令が入っています。命令を検査する方法とそこに値を格納する方法については, 第 4.3 節 で説明します。

シンボリック名を持たないプログラム記憶位置は,コンパイラ生成型に対応づけられません。そのような記憶位置を検査したりそこに値を格納したりできるようにするため,デバッガはそれらの記憶位置を省略時の型であるロングワード整数へ対応づけます。シンボリック名を持たない記憶位置を指定した場合には, 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 コマンドと DEPOSIT コマンド。これらはそれぞれ本項と 第 4.1.4 項 で説明されている。

  • IF,FOR,REPEAT,WHILE の各コマンド ( 第 13.6 節 を参照 )。

  • WHEN 句。これは SET BREAK,SET TRACE,SET WATCH の各コマンドといっしょに使用される ( 第 3.3.4 項 を参照 )。

この説明は言語式を評価するすべてのコマンドと構造に対して当てはまりますが,特に 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 に設定してある場合,どちらもアドレス式のアドレスを表示します。


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.