Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

BREAK

ブレークポイントで実行を中断します。ユーザの中断を有効または無効にします。

Synopsis

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 の中断を有効または無効にします。

Note:

ObjectScript の従来のバージョンでは、BREAK コマンドの省略形 (B) だけが使用されていました。現在のバージョンでは、どちらの形式も使用されています。

必要な権限

コードの実行時に BREAK 文を使用するには、ユーザに、%Development リソースを U (使用) 権限で使用できるロール (%Developer や %Manager など) が割り当てられている必要があります。ユーザをロールに割り当てるには、SQL の GRANT 文を使用するか、管理ポータルの システム, セキュリティ管理, ユーザ オプションを使用してユーザ定義を編集します。

引数

pc

オプションの後置条件式です。Caché は、後置条件式が True (0 以外の数値に評価される) の場合に BREAK コマンドを実行します。Caché は、後置条件式が False (0) の場合はコマンドを実行しません。詳細は、"Caché ObjectScript の使用法" の "コマンド後置条件式" を参照してください。

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 に遭遇すると、Caché はルーチンを中断し、プログラマ・プロンプトに戻ります。そして、他の ObjectScript コマンドを使用して、デバッグを実行できます。例えば、WRITE コマンドを使用して、中断中の箇所の変数値を調べ、SET コマンドを使用して、これらの変数やそれ以外の変数に新しい値を指定することができます。ルーチン行エディタ (XECUTE ^%) を呼び出して、ルーチンを修正することもできます。BREAK を使用してルーチンの実行を中断した後、引数なしの GOTO を使用して、通常の実行を再開することができます。または、GOTO コマンドの引数としてこの場所を指定して、他の場所から実行を再開することもできます。

Note:

コード内では BREAK コマンドではなく、ZBREAK コマンドを使用して Caché デバッガを呼び出すことを推奨します。デバッガには、より多彩なデバッグ機能があります。

%SYSTEM.ProcessOpens in a new tab クラスの BreakMode()Opens in a new tab メソッドを使用すると、現在のプロセスに対する引数なしの BREAK の動作を構成できます。Config.MiscellaneousOpens in a new tab クラスで BreakModeOpens in a new tab プロパティを設定することで、引数なしの BREAK のシステム全体の動作を構成できます。

すべての引数なしのコマンドと同様に、引数なしの BREAK と、同じ行にあるその直後のコマンドとの間に少なくとも 2 つの空白を挿入する必要があります。

引数なしの BREAK を条件付きで使用する

コード内の引数なしの BREAK コマンドに条件を指定すると、ルーチンを変更しなくても、単に変数を設定するだけで同じコードを再実行できるので便利です。例えば、ルーチンに以下の行があるとします。

   BREAK:$DATA(debug)

変数 debug を設定すると、ルーチンを中断し、ジョブをプログラマ・モードに戻すことができます。また、変数 debug をクリアすると、ルーチンの実行を継続できます。

標準のブレークポイントを設定する BREAK の拡張引数

中断したいルーチンのすべての位置に、引数なし BREAK コマンドを置く必要はありません。BREAK には "拡張された" 一連の引数 (extend) があり、この引数を使用して、引数なしの BREAK コマンドがコード全体に散在しているかのように、定期的にルーチンを中断させることができます。以下のテーブルは、さまざまな BREAK コマンド拡張引数です。

引数 説明
"S" BREAK "S" (シングル・ステップ) を使用すると、コードのコマンド (生成されたトークン) を一度に 1 つずつ実行します。すべての ObjectScript コマンドがトークンを生成するわけではありません。一部のコマンドは複数のトークンを生成するため、複数のステップとして解析されます (下記を参照してください)。Caché は、DO コマンドや XECUTE コマンドによって呼び出されたコマンド、または FOR ループやユーザ定義関数で中断をを止め、コマンドやループの完了時に次のトークンで再開します。
"S+" BREAK "S+"BREAK "S" と同様に機能します。ただし、DO コマンドや XECUTE コマンドによって呼び出されたコマンド、または FOR ループやユーザ定義関数での中断を Caché が含める点が異なります。
"S-" BREAK "S-" を使用すると、現在のレベルでのブレーク・ステップ実行 (“S” または “L”) が無効になり、前のレベルでのシングル・ステップ実行が有効になります。現在のレベルでは BREAK "C" と同じように動作し、前のレベルでは BREAK "S" と同じように動作します。
"L" BREAK "L" (行ステップ) を使用して、各行の最初で処理を中断しながら、コードを単一ルーチン行ごとに実行します。トークンを生成しない行は無視されます (下記参照)。Caché は、DO コマンドや XECUTE コマンドによって呼び出されたコマンド、または FOR ループやユーザ定義関数で中断をを止め、コマンドやループの完了時に次の行で再開します。
"L+" BREAK "L+"BREAK "L" と同様に機能します。ただし、DO コマンドや XECUTE コマンドによって呼び出されたコマンド、または FOR ループやユーザ定義関数で各ルーチン行の最初において Caché が中断を継続する点が異なります。
"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”CATCH 文で中断しません。

BREAK “S”BREAK “L” 間で 1 つ異なる点は、多くのコマンド行が複数のトークンを生成するため、複数のステップで構成されることです。必ずしもこれが明白であるとは限りません。例えば、以下はすべて 1 つの行 (および 1つの ObjectScript コマンド) で記述されていますが、BREAK “S” は、それぞれを 2 つのステップとして解析します。SET x=1,y=2, KILL x,y, WRITE “hello”,!, IF x=1,y=2

ブレークポイント後のコード実行を再開するには、ターミナル・プロンプトで GOTO コマンド (短縮形は G) を発行します。詳細は、"Caché ObjectScript の使用法" の "デバッグ" を参照してください。

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 モード・プロトコルの詳細は、"Caché 入出力デバイス・ガイド" の "ターミナル入出力" を参照してください。

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
   }

関連項目

FeedbackOpens in a new tab