ここでの説明は、言語環境プログラムで稼働しているプログラムに適用されます。 言語環境プログラムで稼働していないプログラムについては、言語環境プログラムの外部で始動されるプログラムに対する Debug Tool の始動の説明を参照してください。
ここでは、TEST ランタイム・オプションの使用時に考慮する必要がある要因についていくつか説明し、例を示します。また、指定が必要になる可能性のあるその他のランタイム・オプションについても説明します。TEST ランタイム・オプションの構文について、「Debug Tool リファレンスおよびメッセージ」のトピック『TEST ランタイム・オプション』で説明しています。
Debug Tool がどのようにしてユーザーのアプリケーションの制御を獲得し、デバッグ・セッションを開始するかを指定する場合には、TEST ランタイム・オプションを使用します。TEST オプションの最も単純な形式は、TEST にサブオプションを指定しない形式です。ただし、サブオプションを指定すると、柔軟性が増します。使用可能なサブオプションのタイプには 4 つあり、以下にそれぞれを要約しています。
TEST ランタイム・オプションを使用する場合、いくつかの考慮点があるので、このセクションで説明します。
C、C++、または PL/I では、サブオプションを含む TEST オプションを、#pragma runopts または PLIXOPT ストリングで定義しておき、実行時にサブオプションの無い TEST を指定することができます。これにより、#pragma runopts または PLIXOPT ストリングで指定したサブオプションが 有効になります。
TEST/NOTEST ランタイム・オプションは、SET TEST コマンドを使用して随時変更可能です。
いくつかのサブオプションが NOTEST により使用できなくなります が、それらは引き続き許可されます。すなわち、プログラムを NOTEST オプションを使用して開始し、後でデバッグ・セッションを行うときに有効にしたいサブオプションを指定できます。プログラムは、Debug Tool が制御を得ることなく実行を開始します。
NOTEST で指定したサブオプションを使用可能にするには、プログラムの実行時に Debug Tool を開始するため、ライブラリー・サービス呼び出し (例えば、CEETEST、PLITEST、または __ctest() 関数など) を使用します。
有効なテスト・レベルにより、ある条件で、あるいは特定のプログラム箇所で Debug Tool が制御を得る場合には、関連アクションのない暗黙ブレークポイントが想定されます。これは、初期コマンド・ストリングまたは基本コマンド・ファイルを使用する その条件または箇所のブレークポイントを事前に定義していない場合にも起こります。制御は、端末あるいは基本コマンド・ファイルに渡されます。
基本コマンド・ファイルは、代用端末の役割をします。コマンドのソースとしてこれにアクセスした後、すべてのコマンドが実行されるまで、またはアプリケーションが終了するまで、その役割をこの機能で果たし続けます。基本コマンド・ファイルが USE ファイルと異なる点は、USE ファイルではプログラムに制御を戻す コマンド (STEP や GO など) があると、その後のコマンドはすべて廃棄される点です。ただし、基本コマンド・ファイル内から開始された USE ファイルは、基本コマンド・ファイルの特性を継承し、完了するまで実行できます。
ランタイム・オプションに含まれるコマンド・ストリングから成るか、基本コマンド・ファイルから成るかにかかわらず、初期コマンド・リストには、2 次ファイルからコマンドを得るための USE コマンドを含めることができます。基本コマンド・ファイルから始動された場合には、USE ファイルは基本コマンド・ファイルの特性を継承します。
バッチ・モードの場合、コマンド・ファイルの終わりに達すると、プログラムが終了するまで、コマンドが要求されるたびに GO コマンドが実行されます。プログラムの終了後に別のコマンドが要求されると、QUIT コマンドが強制的に実行されます。
Debug Tool がプログラム初期化中に始動される場合は、メイン・プロローグのすべての命令が実行される前に始動されます。 その時点では、プログラム・ブロックはアクティブにならず、メイン・プロシージャー内の変数は参照できず、コンパイル単位を呼び出すこともできず、GOTO コマンドは使用できません。ただし、静的変数に対する参照は可能です。
この時点で、他のコマンドを入力する前に STEP コマンドを入力すると、プログラムと言語環境プログラムの初期化が両方完了し、すべての変数にアクセスできるようになります。また、すべての有効なコマンドを入力することができるようになります。
プログラムの実行中に (例えば、CEETEST 呼び出しを使用して) Debug Tool が始動された場合は、アプリケーションに関連付けられたコンパイル単位をすべては検出できない可能性があります。現在活動状態になっていないロード・モジュール内のコンパイル単位は、Debug Tool の初期設定よりも前に実行されていたとしても、Debug Tool には認識されません。
例えば、ロード・モジュール mod1 がコンパイル単位 cu1 と cu2 を含み、両方とも TEST オプションでコンパイルされたとします。コンパイル単位 cu1 はロード・モジュール mod2 に含まれている cux を呼び出し、cux は処理が完了すると制御を戻します。コンパイル単位 cu2 は、CEETEST ライブラリー・サービスへの呼び出しを含んでいます。CEETEST の呼び出しによって Debug Tool が初期化されると、cu1 および cu2 のみが Debug Tool に認識されます。Debug Tool は cux を認識しません。
初期コマンド・ストリングは、Debug Tool がプロセスで最初に初期化されるときに、一度だけ実行されます。
優先ファイル内のコマンドは、Debug Tool がプロセスで最初に初期化されるときに、一度だけ実行されます。
セッション・ログは、入力されたコマンド、およびそれらのコマンドの実行の結果を保管します。セッション・ログは、コマンドの実行の結果をコメントとして保存します。これにより、セッション・ログをコマンド・ファイルとして使用できます。
ここで述べた内容に関して詳しくは、以下のトピックを参照してください。
言語環境プログラムのランタイム・オプションは、以下の優先順位に従って 処理されます (最高位から最下位へ)。
ソース・プログラムのオブジェクト・モジュールが、CEEUOPT オブジェクト・モジュールよりも前にリンケージ・エディターに入力される場合は、これらのオプションが CEEUOPT のデフォルトを オーバーライドします。リンケージ・エディターの制御ステートメントを使用して、オブジェクト・ モジュールが入力される順序を強制的に決定することができます。
サブオプションは、以下の順序で処理されます。
ここで述べた内容に関して詳しくは、以下のトピックを参照してください。
以下の TEST ランタイム・オプションの使用例は、ユーザー・プログラムで使用可能なランタイム・オプションを説明しています。ここでは、完全なコマンドは示されていません。TEST ランタイム・オプションの完全な構文は、「Debug Tool リファレンスおよびメッセージ」に記載されています。
NOTEST を指定し、Debug Tool が最初にアクティブになったプログラムから制御が戻ると、非言語環境プログラムのプログラムをデバッグしたり、非言語環境プログラムのイベントを検出したりすることができなくなります。
サブオプションについての定義が他に存在しない場合、IBM 提供のデフォルトのサブオプションは (ALL, *, PROMPT, INSPREF) です。
TEST(,,,TCPIP&machine.somewhere.something.com%8001:*) TEST(,,,TCPIP&9.24.104.79%8001:*) NOTEST(,,,TCPIP&9.24.111.55%8001:*)
ここで述べた内容に関して詳しくは、以下のトピックを参照してください。
COBOL プログラムと PL/I プログラムをデバッグする場合、STORAGE および TRAP(ON) という 2 つのランタイム・オプションが追加で必要となります。
STORAGE ランタイム・オプションは、割り振りおよび解放時 の初期のストレージの内容と、「ストレージ不足」状態のために予約される ストレージ量を制御します。STORAGE ランタイム・オプションのパラメーターの 1 つを 指定すると、そのパラメーターによって処理される割り振り済みストレージが すべてその値に初期設定されます。プログラムが、自己初期化変数を持っていない場合は、ユーザーが STORAGE ランタイム・オプションを指定する必要があります。
TRAP(ON) ランタイム・オプションは、Debug Tool に例外を渡す言語環境プログラム条件処理ハンドラーを完全に使用可能にする場合に使用します。例外が起こったときに Debug Tool が自動的に制御を行うように したい場合、TEST オプションと一緒に必ずこのオプションを 使用する必要があります。また、GO BYPASS コマンドを使用する場合や、 作成したハンドラーをデバッグする場合にも TRAP(ON) ランタイム・オプションを 使用してください。Debug Tool で TRAP(OFF) を使用すると、条件、異常終了、または割り込みの発生時の オペレーティング・システムによるアプリケーションや Debug Tool のキャンセルなど、予測不能の結果が発生します。
TEST ランタイム・オプションは、次の #pragma を使用して、プログラムの始動時に、またはユーザーのソースの中で直接指定することができます。
#pragma runopts (test(suboption,suboption...))
この #pragma は、ユーザーのソース・ファイル内の最初のステートメントよりも前に なければなりません。例えば、ソース・ファイルで次のように指定し、
#pragma runopts (notest(all,*,prompt))
コマンド行で TEST と入力すると、その結果は、以下のようになります。
TEST(ALL,*,PROMPT).
TEST は、#pragma で指定した NOTEST オプションをオーバーライドし、TEST 自体にはサブオプションがないため、サブオプション ALL、*、および PROMPT は有効なまま残ります。
異なる #pragmas が指定された 2 つ以上のコンパイル単位を一緒にリンクすると、最初のコンパイルに指定されたオプションが採用されます。複数のエンクレーブ (コンパイル単位) がある場合、それぞれの新規プロセスで 最初に始動されたエンクレーブで指定したオプションが採用されます。
コマンド行と #pragma にオプションを指定すると、NOEXECOPS を指定しない限り、#pragma で指定されたオプションは、コマンド行で指定されたオプションによってオーバーライドされます。#pragma または EXECOPS コンパイラー・オプションで NOEXECOPS を指定すると、コマンド行で指定したオプションは有効になりません。
ここで述べた内容に関して詳しくは、以下のトピックを参照してください。