[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

13 その他の便利な機能

本章では,デバッガが持つ次の便利な機能について説明します。

13.1 デバッガ・コマンド・ プロシージャの使用

デバッガ・コマンド・プロシージャは,ファイルに記述された一連のコマンドです。 デバッガがコマンド・プロシージャを実行するよう指定して, デバッグ・セッションを再作成したり,前のセッションを続行したり,デバッグ・ セッションの間に同じデバッガ・コマンドを何度も入力しなくてもすむようにしたりできます。 コマンド・プロシージャにはパラメータを引き渡すことができます。

DCLコマンド・プロシージャの場合と同様に,デバッガ・コマンド・プロシージャを実行するには, ファイル指定の先頭にアットマーク(@)を付けます。@ はプロシージャ実行コマンドです。

デバッガ・コマンド・プロシージャは,デバッガ初期化ファイル(第13.2節を参照)に指定されているような標準的な設定用デバッガ・ コマンドを数多く定期的に実行する場合に特に便利です。 また,デバッガ・ログ・ファイルをコマンド・プロシージャとして使用することもできます( 第13.3節を参照)。

13.1.1 基本的な規則

次に示すのは,デバッガ・コマンド・プロシージャBREAK7.COMの例です。

     ! ***** デバッガ・コマンド・プロシージャBREAK7.COM *****
     SET BREAK/AFTER:3 %LINE 120 DO (EXAMINE K,N,J,X(K); GO)
     SET BREAK/AFTER:3 %LINE 160 DO (EXAMINE K,N,J,X(K),S; GO)
     SET BREAK %LINE 90

このコマンド・プロシージャをプロシージャ実行コマンド(@)で実行すると, プロシージャ内に記述されたコマンドがその順番に実行されます。

コマンド・プロシージャへのコマンド入力の規則については,デバッガのオンライン・ ヘルプを参照してください( HELP Command_Formatと入力します) 。

コマンド・プロシージャには,パラメータを引き渡すことができます。 パラメータ引き渡しの規則については,第13.1.2 項を参照してください。

プロシージャ実行(@)コマンドは,他のデバッガ・コマンドと同様に入力することができます。 すなわち,端末から直接入力したり,別のコマンド・ プロシージャ内から入力したり,SET BREAKなどのコマンドのDO句から入力したり, 画面表示定義のDO句から入力したりすることができます。

プロシージャ実行(@)コマンドに指定するファイル指定が完全ファイル指定ではない場合, デバッガはSYS$DISK:[]DEBUG.COMをコマンド・プロシージャの省略時のファイル指定とみなします。 たとえば,現在の省略時のディレクトリにあるコマンド・ プロシージャBREAK7.COMを実行するためには, 次のコマンド行を入力します。

     DBG> @BREAK7

SET ATSIGNコマンドは,省略時のファイル指定であるSYS$DISK:[]DEBUG.COM の一部またはすべてのフィールドの変更を可能にします。SHOW ATSIGN コマンドは,コマンド・プロシージャの省略時のファイル指定を表示します。

省略時の設定では,コマンド・プロシージャから読み込まれたコマンドはエコーバックされません。SET OUTPUT VERIFY コマンドを入力すると,コマンド・ プロシージャから読み込まれたすべてのコマンドが,DBG$OUTPUT で指定された現在の出力装置にエコーバックされます。省略時の出力装置はSYS$OUTPUT です。コマンド・プロシージャから読み込まれたコマンドがエコーバックされるかどうかを明らかにするには,SHOW OUTPUT コマンドを使用します。

コマンド・プロシージャ内のコマンドを実行した結果,警告かそれ以上の重大な診断メッセージが表示された場合, そのコマンドは強制終了されます。 ただしコマンド・プロシージャの実行は次のコマンド行から続けられます。

13.1.2 コマンド・プロシージャへのパラメータの引き渡し

DCLコマンド・プロシージャの場合と同様に,デバッガ・コマンド・プロシージャにもパラメータを引き渡すことができます。 ただし,いくつかの点でその方法が異なります。

ここで説明する規則に従って,ユーザはデバッガ・コマンド・プロシージャに対して必要なだけパラメータを引き渡すことができます。 パラメータには, アドレス式,コマンド,または現在使用中の言語で記述された値式を指定できます。 コマンド文字列は二重引用符(")で囲み,各パラメータはコンマ(,) で区切らなければなりません。

パラメータが引き渡される側のデバッガ・コマンド・プロシージャには, 引き渡された実パラメータと,コマンド・プロシージャ内で宣言された仮パラメータ( シンボル)とを結び付けるDECLAREコマンド行が必要です。

DECLAREコマンドは,コマンド・プロシージャ内でのみ有効です。DECLARE コマンドの構文は次のとおりです。

     DECLARE p-name:p-kind[, p-name:p-kind[,  . . .]]

それぞれのp-name:p-kindの組み合わせは,仮パラメータ( p-name)をパラメータの種類(p-kind) と関連づけています。有効なp-kindキーワードを次に示します。

ADDRESS 実パラメータをアドレス式として解釈する。
COMMAND 実パラメータをコマンドとして解釈する。
VALUE 実パラメータを現在使用中の言語で記述された値式として解釈する。

次の例は,パラメータがコマンド・プロシージャに引き渡されたとき,どのように処理されるかを示しています。 コマンド・プロシージャEXAM.COM の中のDECLARE K:ADDRESSコマンドは,仮パラメータKを宣言しています。 EXAM.COMに引き渡される実パラメータはアドレス式として解釈されます。 EXAMINE Kコマンドは,そのアドレス式の値を表示します。SET OUTPUT VERIFYコマンドは,コマンドがデバッガに読み込まれたとき,それらをエコーバックします。

     ! ***** デバッガ・コマンド・プロシージャEXAM.COM *****
     SET OUTPUT VERIFY
     DECLARE DBG:ADDRESS
     EXAMINE DBG

次のコマンド行は,EXAM.COMを実行します。このとき実パラメータARR24 を引き渡します。EXAM.COM内でARR24はアドレス式(この場合は配列変数) として解釈されます。

     DBG> @EXAM ARR24
     %DEBUG-I-VERIFYIC, entering command procedure EXAM
      DECLARE DBG:ADDRESS
      EXAMINE DBG
     PROG_8\ARR24
         (1):        Mark A. Hopper
         (2):        Rudy B. Hopper
         (3):        Tim B. Hopper
         (4):        Don C. Hopper
         (5):        Mary D. Hopper
         (6):        Jeff D. Hopper
         (7):        Nancy G. Hopper
         (8):        Barbara H. Hopper
         (9):        Lon H. Hopper
        (10):        Dave H. Hopper
        (11):        Andy J. Hopper
        (12):        Will K. Hopper
        (13):        Art L. Hopper
        (14):        Jack M. Hopper
        (15):        Karen M. Hopper
        (16):        Tracy M. Hopper
        (17):        Wanfang M. Hopper
        (18):        Jeff N. Hopper
        (19):        Nancy O. Hopper
        (20):        Mike R. Hopper
        (21):        Rick T. Hopper
        (22):        Dave W. Hopper
        (23):        Jim W. Hopper
        (24):        Robert Z. Hopper
     %DEBUG-I-VERIFYIC, exiting command procedure EXAM
     DBG>

DECLAREコマンドで指定されたそれぞれのp-name: p- kindの組み合わせは,1つのパラメータを結び付けます。たとえば1 つのコマンド・プロシージャに5つのパラメータを引き渡す場合,5つの対応する p-name:p-kindの組み合わせが必要になります。 これらの組み合わせは常に指定した順番に処理されます。

たとえば,次のコマンド・プロシージャEXAM_GO.COMは,アドレス式(L)とコマンド文字列(M) の2つのパラメータを受け取ります。その後,アドレス式が調べられ, コマンドが実行されます。

     ! ***** デバッガ・コマンド・プロシージャEXAM_GO.COM *****
     DECLARE L:ADDRESS, M:COMMAND
     EXAMINE L; M

次の例は,検査対象の変数X,実行対象のコマンド@DUMP.COMを渡すEXAM_ GO.COMの実行方法を示しています。

     DBG> @EXAM_GO X, "@DUMP"

組み込みシンボル%PARCNTは,コマンド・プロシージャ内だけで使用できるものであり, コマンド・プロシージャへさまざまな個数のパラメータを引き渡せるようにします。%PARCNT の値は,コマンド・プロシージャへ引き渡す実パラメータの個数を示します。

次の例では,組み込みシンボル%PARCNTが使用されています。コマンド・ プロシージャVAR.DBGには,次の行が含まれています。

     ! ***** デバッガ・コマンド・プロシージャVAR.DBG *****
     SET OUTPUT VERIFY
     ! 引き渡されるパラメータの個数を表示する。
     EVALUATE %PARCNT
     ! 引き渡されたパラメータをすべて結合して値を取得するまでループする。
     FOR I = 1 TO %PARCNT DO (DECLARE X:VALUE; EVALUATE X)

次のコマンド行は,VAR.DBGにパラメータ12,37,45を引き渡して実行します。

     DBG> @VAR.DBG 12,37,45
     %DEBUG-I-VERIFYIC, entering command procedure VAR.DBG
     ! 引き渡されるパラメータの個数を表示する。
     EVALUATE %PARCNT
     3
     ! 引き渡されたパラメータをすべて結合して,
     ! 値を取得するまでループする。
     FOR I = 1 TO %PARCNT DO (DECLARE X:VALUE; EVALUATE X)
     12
     37
     45
     %DEBUG-I-VERIFYIC, exiting command procedure VAR.DBG
     DBG>

VAR.DBGが実行されるとき,%PARCNTの値は3です。したがって,VAR.DBG内のFOR ループは3回繰り返されます。FORループでは,DECLAREコマンドが3 つの各実パラメータ(12が最初)を新しい宣言Xに結び付けます。それぞれの実パラメータは, 現在使用中の言語の値式として解釈され,EVALUATE X コマンドがその値を表示します。

13.2 デバッガ初期化ファイルの使用

デバッガ初期化ファイルはコマンド・プロシージャであり,論理名DBG$INIT が付けられています。このファイルはデバッガの起動時に自動的に実行されます。 デバッガを起動するたびにファイル内に記述されたコマンドが自動的に実行されます。

初期化ファイルには,デバッグ環境を整えるため,またはユーザ・プログラムが毎回の実行時にあらかじめ決められた方法で実行されるよう制御するために, デバッグ・セッションを開始するときに必ず入力しなければならないコマンド行が含まれています。

たとえば,ファイルDEBUG_START4.COMに次のコマンドが含まれているとします。

     ! ***** デバッガ初期化ファイルDEBUG_START4.COM *****
     ! デバッグ・セッションを省略時のログ・ファイル(SYS$DISK:[]DEBUG.LOG)に
     記録する。
     SET OUTPUT LOG
     !
     ! コマンド・プロシージャから読み込まれたコマンドをエコーバックする。
     SET OUTPUT VERIFY
     !
     ! ソース・ファイルが現在の省略時ディレクトリにない場合は[SMITH.SHARE]を
     使用する。
     SET SOURCE [],[SMITH.SHARE]
     !
     ! 画面モードを起動する。
     SET MODE SCREEN
     !
     ! シンボルSBをSET BREAKコマンドとして定義する。
     DEFINE/COMMAND SB = "SET BREAK"
     !
     ! SHOW MODULE *コマンドをKP7に割り当てる。
     DEFINE/KEY/TERMINATE KP7 "SHOW MODULE *"

このファイルをデバッガ初期化ファイルにするには,DCLのDEFINEコマンドを使用します。 次に例を示します。

     $ DEFINE DBG$INIT WORK:[JONES.DBGCOMFILES]DEBUG_START4.COM

13.3 ログ・ファイルへのデバッグ・セッションの記録

デバッガ・ログ・ファイルは,デバッグ・セッションの履歴を記録します。 デバッグ・セッションの間に,入力された各コマンドとその結果のデバッガの出力がファイルに保存されます。 次にデバッガ・ログ・ファイルの例を示します。

     SHOW OUTPUT
     !noverify, terminal, noscreen_log, logging to DSK2:[JONES.P7]DEBUG.LOG;1
     SET STEP NOSOURCE
     SET TRACE %LINE 30
     SET BREAK %LINE 60
     SHOW TRACE
     !tracepoint at PROG4\%LINE 30
     GO
     !trace at PROG4\%LINE 30
     !break at PROG4\%LINE 60
          .
          .
          .

DBG>プロンプトは記録されず,デバッガの出力内容は感嘆符が付けられてコメントになるので, ファイルは修正なしでデバッガ・コマンド・プロシージャとして使用することができます。 したがって,長いデバッグ・セッションに割り込みがかかったとき, ログ・ファイルを他のデバッガ・コマンド・ プロシージャと同じように実行することができます。ログ・ファイルを実行すると, 前回中断したところまでデバッグ・セッションが復元されます。

デバッガ・ログ・ファイルを作成するには,SET OUTPUT LOGコマンドを使用します。 省略時には,デバッガはログをSYS$DISK:[]DEBUG.LOGに書き込みます。 デバッガ・ログ・ファイルに名前を付けるには,SET LOGコマンドを使用します。 省略時のファイル指定のどのフィールドでも上書きすることができます。 たとえば,次のコマンドを入力すると,その後デバッガはセッションをファイル[JONES.WORK2]MONITOR.LOG に記録します。

     DBG> SET LOG [JONES.WORK2]MONITOR
     DBG> SET OUTPUT LOG

SET OUTPUT LOGコマンドをデバッガ初期化ファイルに入力する場合もあります。 第13.2節を参照してください。

SHOW LOGコマンドは,デバッガがログ・ファイルに書き込みを行っているかどうかを報告し, 現在のログ・ファイルを示します。SHOW OUTPUTコマンドは, 現在の出力オプションをすべて示します。

画面モードでデバッグしているとき,SET OUTPUT SCREEN_LOGコマンドを使用して画面の内容を更新される様子そのままに記録することができます。 このコマンドを使用するには,デバッグ・セッションのログがすでに記録中になっていなければなりません。 すなわち,SET OUTPUT SCREEN_ LOGコマンドは,SET OUTPUT LOGコマンドを入力したあとでだけ有効になります。SET OUTPUT SCREEN_LOG コマンドで画面情報を保存すると大きなログ・ ファイルが作成されるため,長いデバッグ・セッションで使用することは望ましくありません。 画面モードの情報を保存するその他の方法については,SAVE コマンドおよびEXTRACTコマンドの説明を参照してください。

ログ・ファイルをコマンド・プロシージャとして使用するときは,まずSET OUT PUT VERIFY コマンドを入力して,読み込まれたデバッガ・コマンドをエコーバックするようにしなければなりません。

13.4 コマンド,アドレス式,値の各シンボルの定義

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"

13.4.2 アドレス式のシンボルの定義

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

13.4.3 値のシンボルの定義

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>

13.5.2 より高度な方法

ここでは,キー定義のより高度な方法について説明します。特に,状態キーの使用に関して説明します。

次のコマンド行は,コマンドとしては不完全な文字列"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(ecommand[;  . . . ])

たとえば,次のコマンド行は配列の最初の10個の要素をゼロに初期化するためのループを設定します。

     DBG> FOR I = 1 TO 10 DO (DEPOSIT A(I) = 0)

13.6.2 IFコマンド

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

13.6.3 REPEATコマンド

REPEATコマンドは,指定された回数だけ一連のコマンドを実行します。 REPEATコマンドの構文は次のとおりです。

     REPEAT language-expression DO (command[;  . . .])

たとえば,次のコマンド行は連続する2つのコマンド(EXAMINE YとSTEP)を10 回実行するループを設定します。

     DBG> REPEAT 10 DO (EXAMINE Y; STEP)

13.6.4 WHILEコマンド

WHILEコマンドは,指定した言語式(論理式)が真と評価される間,一連のコマンドを実行します。WHILE コマンドの構文は次のとおりです。

     WHILE boolean-expression DO (command[;  . . .])

次のPascalの例は,X1とX2を繰り返しテストし,X2がX1より小さければ, 2つのコマンドEXAMINE X2およびSTEPを実行するループを設定します。

     DBG> WHILE X2 < X1 DO (EX X2;STEP)

13.6.5 EXITLOOPコマンド

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)

13.7 プログラムの実行から独立したルーチンの呼び出し

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>

次の番号は,上記の例の番号に対応しています。

【1】
ルーチンLIB$INIT_TIMER およびLIB$SHOW_TIMERは,共用可能なイメージLIBRTL 内にあります。そのイメージは,それ自身のモジュールの設定によって設定されなければなりません。 これは,そのユニバーサル・ シンボルだけがデバッグ・セッションの間にアクセス可能だからです。 第5.4.2.3項を参照してください。
【2】
このCALLコマンドはルーチンLIB$INIT_TIMERを実行します。
【3】
value returnedのメッセージは,CALLコマンドの実行後,R0 レジスタに戻された値を示しています。

慣例によって,呼び出されたルーチンの実行後,レジスタR0には関数の戻り値( ルーチンが関数である場合),またはプロシージャ終了状態(ルーチンが状態値を戻すプロシージャである場合) が入ります。呼び出されたプロシージャが状態値も関数値も戻さない場合,R0 の値は意味を持ちませんので,value returned のメッセージは無視してかまいません。

【4】
このCALLコマンドはルーチンLIB$SHOW_TIMERを実行します。

次の例は,メモリの統計情報を表示するために,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コマンドの項を参照してください。


[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]