実稼働環境でのプログラムのデバッグ
実稼働環境のプログラムは、以下の任意の特性を備えます。
- プログラムがフックなしでコンパイルされている。
- プログラムが最適化コンパイラー・オプション、通常 OPT コンパイラー・オプション
を指定してコンパイルされている。
- プログラムが、TEST コンパイラー・オプションの SEPARATE サブオプション
をサポートする COBOL コンパイラーでコンパイルされている。
このセクションは、アプリケーションの主要なテストを完了して、最終段階のチューニングに入った後で、Debug Tool のテスト機能をどの程度継続して使用する必要があるかを判断する場合に役立ちます。プログラム・サイズとパフォーマンス上の考慮点についての
検討、フック、ステートメント・テーブル、シンボル・テーブルを除去した
場合の結果、最適化プログラムに関する Debug Tool の使用法などを取り上げています。
このトピックで説明している内容に関して詳しくは、以降のトピックを参照してください。
Debug Tool でのプログラムのファイン・チューニング
初期テストの後に、パフォーマンスの向上やサイズの縮小に使用できる以下の
オプションについて考慮する必要があります。
- COBOL プログラムは、最適化された COBOL プログラムのデバッグの説明にある最適化コンパイラー・オプションを使用してコンパイルします。最適化された PL/I および C/C++ プログラムはデバッグできません。
- フックを除去する。これにより、プログラムのパフォーマンスを向上できます。
- ステートメントおよびシンボル・テーブルを除去する。これにより、プログラムのサイズを小さくできます。
フックの除去
プログラムのパフォーマンスを向上させる 1 つのオプションは、最小限の
フックを使用して、またはフックを使用しないでコンパイルすることです。
- C プログラムでは、オプション TEST(NOLINE, BLOCK, NOPATH) を使用してコンパイルすると、コンパイラーは最小数のフックを挿入しますが、ブロック境界でのタスクはそのまま実行することができます。
- COBOL プログラムでは、以下のコンパイラー・サブオプションを指定してコンパイルすると、フックがないプログラムが作成されます。
- すべてのリリースの Enterprise COBOL for z/OS® バージョン 3、または COBOL OS/390® & VM バージョン 2 コンパイラーで、TEST(NONE)
- Enterprise COBOL for z/OS バージョン 4.1 で、TEST(NOHOOK)
動的デバッグ機能を使用すると、Debug Tool はプログラムのデバッグ中にフックを挿入し、ほとんどすべてのデバッグ・タスクを実行できます。
独自の研究によれば、PL/I ではフックのオーバーヘッドによるパフォーマンス低下は、無視できる程度ということです。さらに、アテンション割り込みを要求しなければならないイベントでは、コンパイル時に
組み込んだフックがないと、Debug Tool は制御を受け取ることができません。組み込んであれば、割り込みを 3 回要求することができます。3 回目の要求の後に、Debug Tool は、プログラムの実行を停止
し、QUIT または GO を入力するようにプロンプトを出す
ことができます。QUIT を入力すると、Debug Tool セッションは終了します。GO を入力すると、制御はアプリケーションに戻ります。
TEST コンパイラー・オプションの特定のサブオプションが指定されてコンパイルされたプログラムには、コンパイル時にフックが挿入されます。ただし、動的デバッグ機能が活動化され (デフォルト)、特定のコンパイラーでプログラムがコンパイルされると、コンパイル時に挿入されたフックが実行時のフックによって置き換えられます。
この置き換えによって、Debug Tool のパフォーマンスが向上します。
動的デバッグ機能の使用時には、特定のパス・フック関数は使用が制限されます。
これらの関数を使用可能にするには、動的デバッグ機能を非アクティブ化する SET DYNDEBUG OFF コマンドを入力します。
これらのコマンドについて詳しくは、「Debug Tool リファレンスおよびメッセージ」を参照してください。
特定プログラムに関して、パフォーマンス・オーバーヘッドに照らして、フックを保持する利点があるのかを調べるのはよい考え方です。
ステートメント・テーブルとシンボル・テーブルの除去
プログラムのサイズが問題と考える場合は、初期テスト期間が過ぎてから、シンボル・テーブルまたはステートメント・テーブル、もしくはその両方
を除去することができます。C および PL/I プログラムでは、オプション TEST(NOSYM) を使用してコンパイルすると、シンボル・テーブルの作成を禁止することができます。
ただし、これらを除去する前に、その利点を考慮してください。ステートメント・テーブルを使用すると、オフセットではなくステートメント番号の
付いた実行ヒストリーを表示することができ、エラー・メッセージはエラーが生じて
いるステートメント番号を示します。シンボル・テーブルを使用すると、名前で変数およびプログラム制御定数を
参照することができます。したがって、プログラムのサイズと、シンボル・テーブルおよびステートメント・テーブルを持つ利点を相殺して考察する必要があります。
以下のコンパイラーで TEST コンパイラー・オプションの SEPARATE サブオプションを使用してコンパイルしたプログラムに対して、シンボル・テーブルが分離デバッグ・ファイルに保存されます。この構造では、シンボル・テーブル情報を保存でき、プログラムのサイズを小さくすることができます。
- Enterprise COBOL for z/OS バージョン 4.1
- Enterprise COBOL for z/OS and OS/390、バージョン 3
- COBOL for OS/390 & VM、バージョン 2 リリース 2
- COBOL for OS/390 & VM、バージョン 2 リリース 1、APAR PQ40298 適用
- Enterprise PL/I for z/OS バージョン 3.5 以降
z/OS バージョン 1.6 以降の C/C++ コンパイラーを使用してコンパイルされた C および C++ プログラムの場合、
DEBUG コンパイラー・オプションの FORMAT(DWARF) サブオプションを指定してコンパイルすることによって、デバッグ情報を分離デバッグ・ファイルに保存できます。
これによって、より小さなプログラムが生成されます。
フック、ステートメント・テーブル、およびシンボル・テーブルを使わないデバッグ
Debug Tool は、TEST ランタイム・オプションの PROMPT サブオプションによって、プログラムの初期設定時に制御を得ることができます。
すべてのフック、ステートメント、およびシンボル・テーブルを実動プログラムから除去した場合でも、Debug Tool は、TEST ランタイム・オプションに ALL または ERROR を指定した場合に
プログラムで条件が発生したとき、あるいは __ctest()、CEETEST、または PLITEST が実行されるときに、制御を受け取ります。
このように限定された環境で Debug Tool が制御を得る場合には、どのステートメント
にエラーがあるのかは不明となり (ステートメント・テーブルがないため)、また、変数を探し出すこともできません (シンボル・テーブルがないため)。したがって、アドレスを使用し、16 進データ値を解釈して変数を調べる必要があります。この限られた環境で実行できる内容は、次のとおりです。
- 制御下にあるブロックを判別します。
list (%LOAD, %CU, %BLOCK);
または
list (%LOAD, %PROGRAM, %BLOCK);
- エラーのアドレスとコンパイル単位のアドレスを判別します。
list (%ADDRESS, %EPA); (ここでは %EPA を使用できます)
- プログラムの区域を 16 進形式で表示します。リストを使用すると、変数のアドレスを見つけて、その変数の内容を表示することができます。例えば、次のように入力することによって、C および C++ プログラム内のアドレス 20058 の
内容を表示することができます。
LIST STORAGE (0x20058);
COBOL または PL/I プログラム内のアドレス 20058 の内容を表示するには、次のように
入力します。
LIST STORAGE (X'20058');
- レジスターを表示します。
LIST REGISTERS;
- プログラムの特性を表示します。
DESCRIBE CU; (for C)
DESCRIBE PROGRAM; (COBOL の場合)
- 動的ブロック・チェーンを表示します。
LIST CALLS;
- オペレーティング・システムからの支援を要求します。
SYSTEM ...;
- プログラムの処理を継続します。
GO;
- プログラムの処理を終了します。
QUIT;
プログラムにステートメントまたはシンボル・テーブルが入っていない場合
は、セッション変数を使用して、より容易に変数値を調査するタスクを
生成することができます。
この限られた環境でも、HLL ライブラリー・ルーチンを使用することができます。
以下のコンパイラーとコンパイラー・オプションの組み合わせでコンパイルしたプログラムは、全デバッグ機能を保持しながら、パフォーマンスを最高に、モジュール・サイズを最小にすることができます。
- Enterprise COBOL for z/OS バージョン 4.1 と TEST(NOHOOK、SEPARATE) コンパイラー・オプション。
- Enterprise COBOL for z/OS および OS/390 バージョン 3 と TEST(NONE、SYM、SEPARATE) コンパイラー・オプション。
- COBOL for OS/390 & VM バージョン 2 と TEST(NONE、SYM、SEPARATE) コンパイラー・オプション。
- Enterprise PL/I for z/OS バージョン 3.5 以降と TEST(ALL、SYM、NOHOOK、SEPERATE) コンパイラー・オプション。
最適化された COBOL プログラムのデバッグ
最適化された COBOL プログラムをデバッグする前に、正しいコンパイラー・オプションを使用して、プログラムをコンパイルしておく必要があります。COBOL プログラムでの TEST または NOTEST コンパイラー・サブオプションの選択を参照してください。
以下に、最適化された COBOL プログラムのデバッグ中に実行できるタスクについて挙げます。
- ブレークポイントの設定はユーザーが行うことができます。最適化プログラムがステートメントを移動または削除する場合、そのステートメントに対してブレークポイントを設定することはできません。
- LIST コマンドまたは LIST TITLED コマンドを使用して、変数の値を表示することができます。Debug Tool は、変数の正しい値を表示します。
- プログラムを 1 ステートメントごとにステップスルーしたり、ブレークポイントに出会うまでプログラムを実行することができます。
- SET AUTOMONITOR および PLAYBACK コマンドを使用できます。
- 以下のコンパイラーのいずれかを使用してコンパイルされた最適化プログラムでは、変数を変更することができます。
- Enterprise COBOL for z/OS バージョン 4.1
- Enterprise COBOL for z/OS および OS/390、バージョン 3 リリース 2 以降
- Enterprise COBOL for z/OS および OS/390、バージョン 3 リリース 1 (APAR PQ63235 インストール済み)
- COBOL for OS/390 & VM バージョン 2 リリース 2
- APAR PQ63234 がインストールされた COBOL for OS/390 & VM バージョン 2 リリース 1
ただし、結果は予測不能である場合があります。
より予測可能な結果を得るには、プログラムを Enterprise COBOL for z/OS バージョン 4.1 でコンパイルし、TEST コンパイラー・オプションの EJPD サブオプションを指定します。ただし、初期化のために VALUE 節で宣言された変数は、変更できません。
- Enterprise COBOL for z/OS バージョン 4.1 を使用して、
TEST コンパイラー・オプションの EJPD サブオプションを指定すれば、
JUMPTO および GOTO コマンドを使用できます。
コンパイラーに対する機能強化により、以下の例外を除いて、最適化されていないプログラムのデバッグと同じように、デバッグ可能なプログラムを作成できます。
- プログラムのフローを変更することはできません。
- Enterprise COBOL for z/OS バージョン 4.1 を使用してコンパイルし、
TEST コンパイラー・オプションの EJPD サブオプションを指定しない限り、
GOTO および JUMPTO コマンドを使用することはできません。
- AT CALL entry_name コマンドは使用できません。代わりに、AT CALL * コマンドを使用してください。
- 最適化プログラムがある変数を削除してしまった場合、その変数への参照は、DESCRIBE ATTRIBUTES コマンドを使用することによってのみ可能です。
他のコマンドを使用しようとすると、その変数がコンパイラーの最適化手法によって廃棄されたことを
示すメッセージが Debug Tool により表示されます。
- AT コマンドを使用すると、以下の制限事項が適用されます。
- すべてのステートメントが削除された部分に対して、行番号を指定することはできません。
- すべてのステートメントが削除された部分に対して、行番号の範囲を指定することはできません。
- 行番号の範囲でその開始点あるいは終了点が、すべてのステートメントが削除された部分の行番号のいずれかを指定する場合、そのような範囲を指定することはできません。
ソース・ウィンドウには最適化プログラムが削除した変数やステートメントが表示されますが、そのような変数やステートメントに対してどの Debug Tool コマンドも使用することはできません。例えば、最適化プログラムが削除した変数の値をリストすることはできません。
|
このインフォメーション・センターでは Eclipse テクノロジーが採用されています。(http://www.eclipse.org)