前へ | 次へ | 目次 | 索引 |
DEFINE コマンドは,長かったり,繰り返し使用されたりするコマンド・シーケンスやアドレス式のシンボルを作成したり,言語式の値をシンボルに格納したりするために使用します。
定義したいシンボルの種類は,DEFINE コマンドに使用するコマンド修飾子(/COMMAND,/ADDRESS,または /VALUE)で指定します。省略時の修飾子は /ADDRESS です。いくつかの DEFINE コマンドで同じ修飾子を使用する場合は,最初に SET DEFINE コマンドを使用して省略時の修飾子を新しく設定することができます。たとえば,SET DEFINE COMMAND は,DEFINE コマンドを DEFINE/COMMAND として動作するように設定します。SHOW DEFINE コマンドは,現在有効な省略時の修飾子を示します。
SHOW SYMBOL/DEFINED コマンドは,DEFINE コマンドで定義したシンボルを示すために使用します。SHOW SYMBOL コマンドに /DEFINED 修飾子を付けないと,ユーザ・プログラム内で定義されたルーチン名や変数名などのシンボルだけを示すので注意してください。
DELETE コマンドは,DEFINE コマンドで作成されたシンボルの定義を削除するために使用します。
コマンド・プロシージャ内でシンボルを定義する場合,/LOCAL修飾子を使用してシンボルの定義をそのコマンド・プロシージャ内だけに制限することができます。
13.4.1 コマンドのシンボルの定義
DEFINE/COMMANDコマンドは,1つまたは複数のコマンド文字列をより短いシンボルに等しいと定義するために使用します。基本的な構文を次の例に示します。
DBG> DEFINE/COMMAND SB = "SET BREAK" DBG> SB PARSER |
この例では,DEFINE/COMMANDコマンドはシンボルSBが文字列SET BREAKに等しいと定義します。コマンド文字列を区切るために二重引用符が使用されていることに注意してください。コマンド行SB PARSERが実行されると,デバッガはシンボルSBを文字列SET BREAKに置き換え,SET BREAKコマンドを実行します。
次の例では,DEFINE/COMMANDコマンドは,シンボルBTを SHOW BREAKコマンドとそれに続くSHOW TRACEコマンドからなる文字列に等しいと定義しています。複数のコマンドを指定する文字列では,コマンド間にセミコロンを挿入して区切ります。
DBG> DEFINE/COMMAND BT = "SHOW BREAK;SHOW TRACE" |
SHOW SYMBOL/DEFINEDコマンドは,シンボルBTを次のように示します。
DBG> SHOW SYM/DEFINED BT defined BT bound to: "SHOW BREAK;SHOW TRACE" was defined /command DBG> |
複雑なコマンドを定義するために,コマンド・プロシージャにパラメータを付けて使用しなければならない場合があります。コマンド・プロシージャへのパラメータの引き渡しについては,第 13.1.2 項 を参照してください。次に例を示します。
DBG> DEFINE/COMMAND DUMP = "@DUMP_PROG2.COM" |
DEFINE/ADDRESS コマンドは,アドレス式をシンボルと等しいと定義するために使用します。/ADDRESS 修飾子は DEFINE コマンドの省略時の修飾子ですが,ここで使用する例では,強調のために指定されています。
次の例では,シンボル B1 は行 378 のアドレスに等しいと定義されています。次のSET BREAK B1コマンドは,行 378 にブレークポイントを設定します。
DBG> DEFINE/ADDRESS B1 = %LINE 378 DBG> SET BREAK B1 |
DEFINE/ADDRESS コマンドは,何度も定義される変数名やルーチン名を参照するために,繰り返し長いパス名を指定しなければならないときに使用すると便利です。次の例では,シンボル UX がパス名 SCREEN_IO\UPDATE\X に等しいと定義されています。短縮された形のコマンド行 EXAMINE UX を次に使用して,モジュール SCREEN_IO のルーチン UPDATE 内での X の値を取得しています。
DBG> DEFINE UX = SCREEN_IO\UPDATE\X DBG> EXAMINE UX |
DEFINE/VALUEコマンドは,言語式の現在の値とシンボルを等しいと定義するために使用します。現在の値とは,DEFINE/VALUEコマンドが入力された時点の値のことを指します。
次に,DEFINE/VALUEコマンドがルーチンの呼び出しの回数を数えるために使用されている例を示します。
DBG> DEFINE/VALUE COUNT = 0 DBG> SET TRACE/SILENT ROUT DO(DEFINE/VALUE COUNT = COUNT + 1) DBG> GO . . . DBG> EVALUATE COUNT 14 DBG> |
この例では,最初の DEFINE/VALUE コマンドがシンボル COUNT の値を 0 に初期化しています。SET TRACE コマンドは,ルーチン ROUT にサイレント・トレースポイントを設定し,DO 句を通して ROUT が呼び出されるたびに COUNT の値を 1 ずつ増分します。実行が再開され中断したとき,EVALUATE コマンドは COUNT の現在の値(ROUT が呼び出された回数)を取得します。
13.5 ファンクション・キーへのコマンドの割り当て
よく使用するコマンドを簡単に入力できるようにするために,キーパッド上のファンクション・キーにはデバッガの起動字に設定される機能があらかじめ定義されています。これらの定義済みの機能については,付録 A を参照してください。キーパッド・キーの機能は,各ユーザのニーズに応じて変更できます。VT200 シリーズまたは VT300 シリーズの端末やワークステーションを使用している場合は,LK201 キーボードのその他のファンクション・キーにコマンドを割り当てることができます。
デバッガ・コマンドの DEFINE/KEY,SHOW KEY,および DELETE/KEY は,それぞれキー定義の割り当て,表示,削除を行います。これらの機能を使用する前に,SET MODE KEYPAD コマンドでキーパッド・モードが有効になっていなければなりません。省略時の設定ではキーパッド・モードは有効になっています。キーパッド・モードでは,キーパッド・キーの定義済みの機能を使用することもできます。
キーパッド・キーをデバッガ・コマンドの入力ではなく数字の入力用に使用するときは,SET MODE NOKEYPAD コマンドを使用します。
13.5.1 基本的な規則
デバッガの DEFINE/KEY コマンドは,DCLのDEFINE/KEY コマンドに類似しており,文字列をファンクション・キーへ割り当てます。次の例では,DEFINE/KEY コマンドは SHOW MODULE * コマンドを入力し実行する機能を KP7(キーパッド・キーの 7)に定義しています。
DBG> DEFINE/KEY/TERMINATE KP7 "SHOW MODULE *" %DEBUG-I-DEFKEY, DEFAULT key KP7 has been defined DBG> |
DEFINE/KEY コマンド,SHOW KEY コマンド,DELETE/KEY コマンドに対しては,正しいキー名(KP7 など)を使用しなければなりません。VT52 および VT100 シリーズの端末と LK201 キーボードでこれらのコマンドに対して使用できる正しいキー名については,DEFINE/KEY コマンドの説明を参照してください。
前の例では,/TERMINATE修飾子はKP7を押すとコマンドが実行されるようにしています。このとき,KP7を押したあとにReturnキーを押す必要はありません。
各定義がそれぞれ別の状態に関連づけられているかぎり,同じ1つのファンクション・キーに対して,いくつでも定義を割り当てることができます。定義済みの状態(DEFAULT,GOLD,BLUEなど)については 付録 A を参照してください。前の例では,KP7 は DEFAULT 状態に定義されていることをメッセージが示してます。これは省略時のキー状態です。
キー定義をデバッガ初期化ファイル(第 13.2 節 を参照)に入力し,デバッガを起動したときすぐにそれらの定義を利用できるようにすることができます。
現在の状態のキー定義を表示するには,SHOW KEY コマンドを入力します。次に例を示します。
DBG> SHOW KEY KP7 DEFAULT keypad definitions: KP7 = "SHOW MODULE *"(echo,terminate,nolock) DBG> |
現在の状態以外の状態のキー定義を表示するには,SHOW KEY コマンドを入力するときに /STATE 修飾子を付けてその状態を指定します。 現在の状態のすべてのキー定義を表示するには,SHOW KEY/ALL コマンドを入力します。
キー定義を削除するには,DELETE/KEY コマンドを使用します。現在の状態以外の状態のキー定義を削除する場合には,/STATE 修飾子を付けてその状態を指定します。次に例を示します。
DBG> DELETE/KEY/STATE=GOLD KP7 %DEBUG-I-DELKEY, GOLD key KP7 has been deleted DBG> |
ここでは,キー定義のより高度な方法について説明します。特に,状態キーの使用に関して説明します。
次のコマンド行は,コマンドとしては不完全な文字列 "SET BREAK %LINE" を KP9 の BLUE 状態に割り当てます。
DBG> DEFINE/KEY/IF_STATE=BLUE KP9 "SET BREAK %LINE" |
定義済みのDEFAULTキー状態は,省略時に設定されます。定義済みのBLUEキー状態は,PF4キーを押すことによって設定されます。前の例(SET BREAK %LINE...)で割り当てられたコマンド行を入力するには,PF4を押してKP9を押し,行番号を入力し,最後にReturnキーを押してコマンド行を終了させ処理します。
SET KEYコマンドは,キー定義の省略時の状態を変更します。たとえば,SET KEY/STATE=BLUEコマンドの入力後,前の例のコマンド行を入力する場合,PF4を押す必要はありません。また,SHOW KEYコマンドは省略時にBLUE状態のキー定義を表示するようになり,DELETE/KEYコマンドは省略時にBLUE状態のキー定義を削除するようになります。
その他のキー状態を作成することができます。次に例を示します。
DBG> SET KEY/STATE=DEFAULT DBG> DEFINE/KEY/SET_STATE=RED/LOCK_STATE F12 "" |
この例では,SET KEYコマンドは現在の状態としてDEFAULTを設定します。DEFINE/KEYコマンドは,F12(LK201キーボード)を状態キーとしています。その結果,DEFAULT状態でF12を押すと現在の状態はREDになります。キー定義は終了せず,他に何も行いません。空文字列がF12に割り当てられます。F12を押したあと,RED状態に関連づけられた定義を持つキーを押すと,REDのコマンドを入力することができます。
13.6 コマンド入力のための制御構造の使用
FOR,IF,REPEAT,WHILEの各コマンドを使用すると,デバッガ・コマンドを入力するためのループ構造や条件付き構造を作成することができます。FOR,REPEAT,WHILEのループを終了するには,対応するコマンドのEXITLOOPを使用します。以降の項ではこれらのコマンドについて説明します。
言語式の評価についての詳しい説明は,
第 4.1.6 項 および 第 14.3.2.2 項 を参照してください。
13.6.1 FORコマンド
FORコマンドは,指定された回数だけ変数を増分する間,一連のコマンドを実行します。FORコマンドの構文は次のとおりです。
FOR name=expression1 TO expression2 [BY expression3] DO(command[; ...]) |
たとえば,次のコマンド行は配列の最初の10個の要素をゼロに初期化するためのループを設定します。
DBG> FOR I = 1 TO 10 DO(DEPOSIT A(I)= 0) |
IFコマンドは,言語式(論理式)が真と評価されたとき一連のコマンドを実行します。IFコマンドの構文は次のとおりです。
IF boolean-expression THEN(command[; ...])[ELSE(command[;...])] |
次のFORTRANの例では,X1が - 9.9に等しくないときEXAMINE X2コマンドを実行し,等しいときにEXAMINE Y1コマンドを実行する,という条件を設定しています。
DBG> IF X1 .NE. -9.9 THEN(EXAMINE X2)ELSE(EXAMINE Y1) |
次のPascalの例では,FORループと条件のテストを結合しています。X1が - 9.9に等しくないとき,STEPコマンドが実行されます。テストは4回行われます。
DBG> FOR COUNT = 1 TO 4 DO(IF X1 <> -9.9 THEN(STEP)) |
REPEATコマンドは,指定された回数だけ一連のコマンドを実行します。REPEATコマンドの構文は次のとおりです。
REPEAT language-expression DO(command[; ...]) |
たとえば,次のコマンド行は連続する2つのコマンド(EXAMINE YとSTEP)を 10回実行するループを設定します。
DBG> REPEAT 10 DO(EXAMINE Y; STEP) |
WHILEコマンドは,指定した言語式(論理式)が真と評価される間,一連のコマンドを実行します。WHILEコマンドの構文は次のとおりです。
WHILE boolean-expression DO(command[; ...]) |
次のPascalの例は,X1とX2を繰り返しテストし,X2がX1より小さければ,2つのコマンドEXAMINE X2およびSTEPを実行するループを設定します。
DBG> WHILE X2 < X1 DO(EX X2;STEP) |
EXITLOOPコマンドは,1つまたは複数のFOR,REPEAT,またはWHILEのループを終了します。EXITLOOPコマンドの構文は次のとおりです。
EXITLOOP [integer] |
整数nは,ネストしたループをいくつ終了するかを指定します。
次のPascalの例では,繰り返しのたびにSTEPコマンドを実行する永久ループを設定しています。各ステップの実行後,Xの値がテストされます。Xが3より大きければ,EXITLOOPコマンドによりループが終了します。
DBG> WHILE TRUE DO(STEP; IF X > 3 THEN EXITLOOP) |
CALLコマンドを使用して,ユーザ・プログラムの通常の実行からは独立して,ルーチンを実行できます。このコマンドは,ユーザ・プログラムを実行する4つのデバッガ・コマンドのうちの 1つです。その他のコマンドはGO,STEP,およびEXITです。
CALLコマンドは,プログラムが実際にそのルーチンを呼び出しているかどうかに関係なく,ルーチンを実行します。呼び出されるルーチンはユーザ・プログラムにリンクされていることが必要です。したがって,CALLコマンドを使用すればどんな目的のためにでもルーチンを実行することができます。たとえば,プログラム実行のコンテキストに無関係にルーチンをデバッグしたり,実行時ライブラリ・プロシージャを呼び出したり,デバッグ情報をダンプするルーチンを呼び出したりするために使用できます。
関連のないルーチンは,遷移アドレスを持つ仮のメイン・プログラムにリンクし,それらをCALLコマンドを使用して呼び出すことによって,デバッグすることができます。
次の例は,必要なコードをプログラム内に記述せずに,プロセス統計を表示するためにCALLコマンドを使用する方法を示しています。この例は,実行時ライブラリ・ルーチンのうち,タイマを初期化するルーチン(LIB$INIT_TIMER)と,経過時間および種々の統計情報を表示するルーチン(LIB$SHOW_TIMER)への呼び出しから構成されています。デバッガの存在がタイミングやカウントに影響を与えることに注意してください。
DBG> SET MODULE SHARE$LIBRTL (1) DBG> CALL LIB$INIT_TIMER (2) value returned is 1 (3) DBG> [ enter various debugger commands ] . . . DBG> CALL LIB$SHOW_TIMER (4) ELAPSED: 0 00:00:21.65 CPU: 0:14:00.21 BUFIO: 16 DIRIO: 0 FAULTS: 3 value returned is 1 DBG> |
次の番号は,上記の例の番号に対応しています。
慣例によって,呼び出されたルーチンの実行後,レジスタR0には関数の戻り値(ルーチンが関数である場合),またはプロシージャ終了状態(ルーチンが状態値を戻すプロシージャである場合)が入ります。呼び出されたプロシージャが状態値も関数値も戻さない場合,R0の値は意味を持ちませんので,value returnedのメッセージは無視してかまいません。
次の例は,メモリの統計情報を表示するために,LIBRTLに存在するLIB$SHOW_VM を呼び出す方法を示しています。やはりデバッガの存在がカウントに影響を与えることに注意してください。
DBG> SET MODULE SHARE$LIBRTL DBG> CALL LIB$SHOW_VM 1785 calls to LIB$GET_VM, 284 calls to LIB$FREE_VM, 122216 bytes still allocated value returned is 1 DBG> |
CALLコマンドを実行するときルーチンにパラメータを引き渡すことができます。詳しい説明および例については,CALLコマンドの項を参照してください。
前へ | 次へ | 目次 | 索引 |