Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


3.4.3.1 実行速度

ウォッチポイントを設定した場合,プログラムの実行速度は変数が静的変数であるか非静的変数であるかによって異なります。静的変数のウォッチでは,デバッガはその変数を含むページを書き込み禁止にします。プログラムがそのページに書き込もうとすると(その変数の値を変更しようとすると),アクセス違反エラーが発生し,デバッガが例外を処理します。すなわち,一時的にそのページに対する書き込み禁止を解除して,命令を終了させ,ウォッチされている変数が変更されたかどうかを決定します。そのページに書き込むとき以外は,プログラムは最大速度で実行されます。

呼び出しスタックまたはレジスタを書き込み禁止にすると問題が発生するので,デバッガは,非静的変数をウォッチするために別の方法を使用します。すなわち,その変数を定義しているルーチン内の各命令をトレースし,命令の実行後,変数値をチェックします。これは,プログラムの実行速度を著しく低下させるので,デバッガは非静的変数にウォッチポイントが設定されると,次のようなメッセージを発行します。


DBG> SET WATCH Y
%DEBUG-I-WPTTRACE, nonstatic watchpoint, tracing every instruction
DBG>

3.4.3.2 非静的変数へのウォッチポイントの設定

非静的変数にウォッチポイントを設定する場合,その変数を定義しているルーチン内で実行が停止していることを確認します。これを簡単に行うには,そのルーチンにトレースポイントを設定して,さらに変数にウォッチポイントを設定する DO 句を指定します。こうしておけば,そのルーチンが呼ばれるたびにトレースポイントが検出され,ルーチン内のローカル変数に対して自動的にウォッチポイントが設定されます。次の例では,WPTTRACE メッセージによって,ウォッチポイントがルーチン ROUT3 のローカル非静的変数である Y に設定されたことが分かります。


DBG> SET TRACE/NOSOURCE ROUT3 DO(SET WATCH Y)
DBG> GO
   .
   .
   .
trace at routine MOD4\ROUT3
%DEBUG-I-WPTTRACE, nonstatic watchpoint, tracing every instruction
   .
   .
   .
watch of MOD4\ROUT3\Y at MOD4\ROUT3\%LINE 16
   16:     Y := 4
   old value:    3
   new value:    4
break at MOD4\ROUT3\%LINE 17
   17:     SWAP(X,Y);
DBG>

実行が,ルーチン ROUT3 の呼び出し元に復帰すると,変数 Y はアクティブでなくなります。したがって,デバッガは自動的にウォッチポイントを取り消し,次のようなメッセージを発行します。


%DEBUG-I-WATCHVAR, watched variable MOD4\ROUT3\Y has gone out of scope
%DEBUG-I-WATCHCAN, watchpoint now canceled

3.4.3.3 非静的変数のウォッチ・オプション

SET WATCH コマンドの修飾子 /OVER,/INTO,および /[NO]STATIC には,非静的変数をウォッチするときのオプションがあります。

非静的変数にウォッチポイントを設定する場合,ルーチン呼び出し時に,次の 2 つのうちいずれかを実行するようデバッガに指示できます。

SET WATCH/OVER コマンドを使用したほうが,性能が良くなります。ただし,呼び出されたルーチンがウォッチされている変数を変更した場合は,実行が呼び出し元に戻ってから,ウォッチポイントが検出されます。SET WATCH/INTO コマンドは,プログラムの実行速度を低下させますが,呼び出されたルーチン内でより正確にウォッチポイントをモニタできます。

デバッガは,変数のアドレス(P0 空間,P1 空間,またはレジスタ)を見ることによって,その変数が静的変数であるか非静的変数であるかを決定します。ユーザは,SET WATCH コマンドの入力時に /[NO]STATIC 修飾子を指定することで,この決定を上書きすることができます。たとえば,P1 空間内に非スタック領域を割り当てた場合は,SET WATCH/STATIC コマンドを使用して,その変数は P1 空間内に存在しても静的変数であることを指定します。反対に,自分自身の呼び出しスタックを P0 空間内に割り当てた場合には,SET WATCH/NOSTATIC コマンドを使用して,その変数は P0 空間内に存在しても非静的変数であることを指定します。

3.4.3.4 インストールされた書き込み可能な共用可能イメージへのウォッチポイントの設定

インストールされた書き込み可能な共用可能イメージにウォッチポイントを設定するには,SET WATCH/NOSTATIC コマンドを使用します(第 3.4.3.3 項 を参照)。

非静的なウォッチポイントを設定しなければならない理由は,次のとおりです。このような共用可能イメージ内で宣言された変数は通常,静的変数です。省略時の設定では,デバッガは,その変数を含むページを書き込み禁止にすることによって静的変数をウォッチします。しかし,インストールされた書き込み可能な共用可能イメージ内のページを,書き込み禁止にすることはできません。したがって,デバッガは,非静的変数の場合と同じように,変数値の変更を発見するために性能の良くない手法を使用しなければなりません。すなわち,個々の命令が実行されるたびに,ウォッチされている記憶位置の値を調べる方法です(第 3.4.3.1 項 を参照)。

他のプロセスが,ウォッチされている記憶位置の値を変更したとしても,デバッガは,ユーザのプログラムがその値を変更したと報告する可能性があります。


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

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

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

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

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 項 を参照してください。

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 節 で説明します。


前へ 次へ 目次 索引