BREAK (ObjectScript)
構文
BREAK:pc extend
B:pc extend
BREAK:pc flag
B:pc flag
引数
引数 | 説明 |
---|---|
pc | オプション — 後置条件式 |
extend | オプション — 引用符付きの文字列として指定された、有効化または無効化されるブレークポイントの種類を示す文字コード。有効な値は、BREAK の拡張引数の一覧に示されています。flag 引数と一緒に使用することはできません。 |
flag | オプション — 中断動作を指定する整数フラグ。flag 値は、引用符で囲んでも囲まなくてもかまいません。有効な値は、0 と 4 (CTRL-C の中断を無効にします)、および 1 と 5 (CTRL-C の中断を有効にします) です。既定値は、コンテキストにより決定されます (詳細は、BREAK flag を参照)。extend 引数と一緒に使用することはできません。 |
説明
BREAK コマンドには、以下の 3 つの構文形式があります。
-
引数なしの BREAK は、現在の場所でコードの実行を中断します。
-
BREAK extend は、一定のブレークポイント間隔でコードの実行を中断します。
-
BREAK flag は、CTRL-C の中断を有効または無効にします。
必要な権限
コードの実行時に BREAK 文を使用するには、ユーザに、%Development リソースを U (使用) 権限で使用できるロール (%Developer や %Manager など) が割り当てられている必要があります。ロールをユーザに割り当てるには、SQL の GRANT 文を使用するか、管理ポータルの [システム管理]→[セキュリティ]→[ユーザ] オプションを使用します。定義を編集するユーザ名を選択し、[ロール] タブを選択して、そのユーザにロールを割り当てます。
主デバイス
主デバイスの入出力リダイレクトを使用するアプリケーションをデバッグする場合、デバッグ・プロンプトではリダイレクトがオフになり、デバッグ・コマンドからの出力はターミナルに表示されます。
引数
pc
オプションの後置条件式です。InterSystems IRIS は、後置条件式が True (0 以外の数値に評価される) の場合に BREAK コマンドを実行します。InterSystems IRIS は、後置条件式が False (0 に評価される) の場合はコマンドを実行しません。 For further details, refer to Command Postconditional Expressions.
extend
BREAK extend は、ブレークポイントの動作を指定する文字列コードをサポートします。引用符は必須です。これらの extend コードのテーブルは、"BREAK の拡張引数" を参照してください。
flag
BREAK flag は、CTRL-C の中断を処理する 4 つの異なる方法をサポートします。
-
BREAK 0 : まだシグナル送信されていない保留中の CTRL-C トラップをすべて破棄します。以降の CTRL-C のシグナル送信を無効にします。
-
BREAK 1 : 保留中の CTRL-C トラップをすべて破棄します。以降の CTRL-C のシグナル送信を有効にします。
つまり、BREAK 1 の実行後に CTRL-C を入力すると、CTRL-C がシグナル送信されます。
-
BREAK 4 : 保留中の CTRL-C トラップを一切破棄しません。以降の CTRL-C のシグナル送信を無効にします。
つまり、以降の BREAK 1 または BREAK 5 コマンドにより CTRL-C が有効になったときに保留中の CTRL-C トラップがシグナル送信されます。
-
BREAK 5 : 保留中の CTRL-C トラップを一切破棄しません。以降の CTRL-C のシグナル送信を有効にします。
つまり、保留中の CTRL-C トラップが、BREAK 5 直後に ObjectScript コマンドでシグナル送信されます。すべてではありませんが、ほとんどの ObjectScript コマンドは、CTRL-C に対してポーリングを実施します。
詳細および例は、"中断を有効または無効にする BREAK フラグ" を参照してください。
引数なしの BREAK
引数なしの BREAK は、遭遇時にコードの実行を中断します。引数なしの BREAK は、プログラムのソース・コードで使用できます。後置条件式は付けても付けなくてもかまいません。このコマンドは、その時点でプログラムの実行を中断し、制御をターミナル・プロンプトに戻します。引数なしの BREAK は、デバッグ目的で使用されます。
ルーチン内に引数なしの BREAK を含めると、ブレークポイントが設定されます。ブレークポイントはルーチンの実行を中断し、プロセスをターミナル・プロンプトに戻します。コードにブレークポイントを埋め込むことによって、デバッグを行う特定のコンテキストを設定できます。実行中に BREAK に遭遇すると、InterSystems IRIS はルーチンを中断し、ターミナルに戻ります。そして、他の ObjectScript コマンドを使用して、デバッグを実行できます。例えば、WRITE コマンドを使用して、中断中の箇所の変数値を調べ、SET コマンドを使用して、これらの変数やそれ以外の変数に新しい値を指定することができます。ルーチン行エディタ (XECUTE ^%) を呼び出して、ルーチンを修正することもできます。BREAK を使用してルーチンの実行を中断した後、引数なしの GOTO を使用して、通常の実行を再開することができます。または、GOTO コマンドの引数としてこの場所を指定して、他の場所から実行を再開することもできます。
コード内では BREAK コマンドではなく、ZBREAK コマンドを使用して ObjectScript デバッガを呼び出すことを推奨します。デバッガには、より多彩なデバッグ機能があります。
You can configure argumentless BREAK behavior for the current process using the BreakMode()Opens in a new tab method of the %SYSTEM.ProcessOpens in a new tab class. You can configure argumentless BREAK behavior system-wide by setting the BreakModeOpens in a new tab property in the Config.MiscellaneousOpens in a new tab class.
すべての引数なしのコマンドと同様に、引数なしの BREAK と、同じ行にあるその直後のコマンドとの間に少なくとも 2 つの空白を挿入する必要があります。
引数なしの BREAK を条件付きで使用する
コード内の引数なしの BREAK コマンドに条件を指定すると、ルーチンを変更しなくても、単に変数を設定するだけで同じコードを再実行できるので便利です。例えば、ルーチンに以下の行があるとします。
BREAK:$DATA(debug)
変数 debug を設定すると、ルーチンを中断し、ジョブをターミナル・プロンプトに戻すことができます。また、変数 debug をクリアすると、ルーチンの実行を継続できます。
標準のブレークポイントを設定する BREAK の拡張引数
中断したいルーチンのすべての位置に、引数なし BREAK コマンドを置く必要はありません。BREAK には "拡張された" 一連の引数 (extend) があり、この引数を使用して、引数なしの BREAK コマンドがコード全体に散在しているかのように、定期的にルーチンを中断させることができます。以下のテーブルは、さまざまな BREAK コマンド拡張引数です。
引数 | 説明 |
---|---|
"S" | BREAK "S" (シングル・ステップ) を使用すると、コードのコマンド (生成されたトークン) を一度に 1 つずつ実行します。すべての ObjectScript コマンドがトークンを生成するわけではありません。一部のコマンドは複数のトークンを生成するため、複数のステップとして解析されます (下記を参照してください)。InterSystems IRIS は、DO コマンドや XECUTE コマンドによって呼び出されたコマンド、または FOR ループやユーザ定義関数で中断を止め、コマンドやループの完了時に次のトークンで再開します。 |
"S+" | BREAK "S+" は BREAK "S" と同様に機能します。ただし、DO コマンドや XECUTE コマンドによって呼び出されたコマンド、または FOR ループやユーザ定義関数での中断を InterSystems IRIS が含める点が異なります。 |
"S-" | BREAK "S-" を使用すると、現在のレベルでのブレーク・ステップ実行 ("S" または "L") が無効になり、前のレベルでのシングル・ステップ実行が有効になります。現在のレベルでは BREAK "C" と同じように動作し、前のレベルでは BREAK "S" と同じように動作します。 |
"L" | BREAK "L" (行ステップ) を使用して、各行の最初で処理を中断しながら、コードを単一ルーチン行ごとに実行します。トークンを生成しない行は無視されます (下記参照)。InterSystems IRIS は、DO コマンドや XECUTE コマンドによって呼び出されたコマンド、または FOR ループやユーザ定義関数で中断を止め、コマンドやループの完了時に次の行で再開します。 |
"L+" | BREAK "L+" は BREAK "L" と同様に機能します。ただし、DO コマンドや XECUTE コマンドによって呼び出されたコマンド、または FOR ループやユーザ定義関数で各ルーチン行の最初において InterSystems IRIS が中断を継続する点が異なります。 |
"L-" | BREAK "L-" を使用すると、現在のレベルでのブレーク・ステップ実行 ("S" または "L") が無効になり、前のレベルでの行ステップ実行が有効になります。現在のレベルでは BREAK "C" と同じように動作し、前のレベルでは BREAK "L" と同じように動作します。 |
"C" | BREAK "C" (クリア・ブレーク) を使用すると、現在のレベルでのブレーク・ステップ実行 ("L" および "S") がすべて停止します。BREAK が前のルーチン・レベルで有効になっている場合は、そのジョブが QUIT を実行した後、前のレベルでブレークが再開します。 |
"C-" | BREAK "C-" を使用すると、現在のレベルおよび前のすべてのレベルでのブレーク・ステップ実行 ("L" および "S") がすべて停止します。これにより、他のデバッグ機能に影響を与えることなく、すべてのレベルでステップ実行を削除できます。 |
"OFF" | BREAK "OFF" は、プロセスに対して構築されたすべてのデバッグを削除します。これは、すべてのブレークポイントとウォッチポイントを削除し、すべてのプログラム・スタック・レベルでステップ実行を無効にします。また、デバッグとトレース・デバイスに関連するものも削除しますが、それらを閉じません。 |
BREAK "S" および BREAK "L" は、トークンを生成する文で中断します。すべての ObjectScript コマンドおよび行がトークンを生成するわけではありません。例えば、BREAK "S" および BREAK "L" は、どちらもラベル行、コメント、および TRY 文を無視します。BREAK "S" は CATCH 文でブレークしますが (CATCH ブロックが入力された場合)、BREAK "L" はブレークしません。
BREAK "S" と BREAK "L" 間で 1 つ異なる点は、多くのコマンド行が複数のトークンを生成するため、複数のステップで構成されることです。必ずしもこれが明白であるとは限りません。例えば、以下はすべて 1 つの行 (および 1つの ObjectScript コマンド) で記述されていますが、BREAK "S" は、それぞれを 2 つのステップとして解析します。
KILL x,y
SET x=1,y=2
IF x=1,y=2 {
WRITE "hello",! }
BREAK "S" parses command postconditionals. 後置条件式が True (コマンドを実行する) の場合、カーソルは後置条件式の後をポイントするように再配置されます。
ブレークポイント後のコード実行を再開するには、ターミナル・プロンプトで GOTO コマンド (短縮形は G) を発行します。詳細は、"コマンド行ルーチンのデバッグ" を参照してください。
BREAK "OFF" コマンドの使用法は、以下の一連のコマンドの使用法と類似しています。
ZBREAK /CLEAR
ZBREAK /TRACE:OFF
ZBREAK /DEBUG:""
ZBREAK /ERRORTRAP:ON
BREAK "C-"
中断を有効または無効にする BREAK フラグ
BREAK flag を使用して、CTRL-C などのユーザの中断を有効にするか無効にするかを制御できます。これらの無効/有効オプション間の実質的な相違点は以下のとおりです。
BREAK 0 および BREAK 1 は、重要な一連のコマンドが CTRL-C シグナルによって中断されないコード・ブロックを作成するために使用できます。ただし、そのようなブロックでのループは、インタラクティブ・ユーザが CTRL-C を使用して中断するのが難しくなる場合があります。これは、CTRL-C トラップの検出と CTRL-C シグナルのポーリングとの間にわずかな遅延が存在するためです。この遅延により、次の BREAK コマンド・ループで CTRL-C のユーザの中断を破棄できる場合があります。
BREAK 4 および BREAK 5 を含むプログラム・ブロックは、インタラクティブ・ユーザが CTRL-C を使用してこのブロックでのループ処理を中断できる機能に影響を与えることなく、重要な一連のコマンドが CTRL-C シグナルによって中断されないコードを作成するために使用できます。
BREAK の既定の flag 動作は、以下のようにログイン・モードに依存します。
-
ターミナル・プロンプトでログインする場合、既定は BREAK 1 となります。CTRL-C などの割り込みは、常に有効化されています。OPEN コマンドまたは USE コマンドに指定された B (/break) プロトコルには何も効果がありません。
-
ルーチンからコードを実行する場合、既定は BREAK 0 となります。CTRL-C などの割り込みは、OPEN または USE コマンドで指定される B (/break) プロトコルによって有効または無効にされています。
OPEN および USE モード・プロトコルの詳細は、"ターミナル入出力" を参照してください。
BREAK flag の例
以下の例では、$ZJOB を使用して、中断を有効にするか無効にするかを決定します。
BREAK 0
DO InterruptStatus
BREAK 1
DO InterruptStatus
WRITE "all done"
InterruptStatus()
IF $ZJOB\4#2=1 {WRITE "Interrupts enabled",!}
ELSE {WRITE "Interrupts disabled",!}
以下の例では、一連の数値のユーザ入力のために FOR ループで READ を使用します。これにより、READ 処理中のユーザの中断を無効にするように BREAK 0 が設定されます。ただし、ユーザが数値以外の値を入力する場合、BREAK 1 は、ユーザが入力値を拒否したり受け入れたりできるようにユーザの中断を有効にします。
SET y="^"
InputLoop
TRY {
FOR {
BREAK 0
READ "input a number ",x
IF x="" { WRITE !,"all done" QUIT }
ELSEIF 0=$ISVALIDNUM(x) {
BREAK 1
WRITE !,x," is not a number",!
WRITE "you have four seconds to press CTRL-C",!
WRITE "or accept this input value",!
HANG 4 }
ELSE { }
SET y=y_x_"^"
WRITE !,"the number list is ",y,!
}
}
CATCH { WRITE "Rejecting bad input",!
DO InputLoop
}