PL/I プログラムの内部マクロ コードのデバッグ

PL/I マクロ言語を本格的に使用する場合や、コードの生成にマクロを広く使用しているプログラムの保守を行う場合、EXEC CICS、EXEC DLI、EXEC SQL などと同じように、生成されたソースのレベルでもデバッグが必要になることがあります。そのような場合は、ここで示す手法を使用して、生成されたコードのすべての行をステップ実行し、変数の値を調査および変更してプログラムの動作を把握することができます。これは、把握または想定していないマクロの動作を検出する場合に特に便利です。生成されたコード レベルでデバッグすることで、動作を正確に理解できます。

マクロ コード内の実際のコードは、PL/I ソース ファイルには含まれていません。ただし、プリプロセス済みのファイルからマクロ コードを利用することができます。マクロに実際に含まれるコードをデバッグするには、プリプロセス済みのファイルをデバッグする必要があります。

デバッグするソース ファイルのプリプロセス済みの出力ファイルを作成し、その出力ファイルをデバッグすることができます。これを行うには、次の設定が必要になります。

プロジェクトに対して -nodebuginfo コンパイラ オプションを設定するには

  1. デバッグするアプリケーションを含むプロジェクトを開きます。
  2. アプリケーション エクスプローラー ビュー で、プロジェクトを右クリックし、[Micro Focus > Project Settings > PL/I Compile Settings > Macro Preprocessor] を選択します。[Properties] ウィンドウに [Macro Preprocessor] ページが表示されます。
  3. [Use Macro Preprocessor] チェック ボックスがオンになっていない場合はオンにします。
  4. [No debug information] (-nodebuginfo) フィールドで、[Value] リストから [Yes] を選択します。
  5. [OK] をクリックして変更内容を保存します。
  6. プロジェクトをリビルドします。これにより、マクロ コードのデバッグに使用する出力ファイルが作成されます。

プロジェクトに対してマクロ プリプロセッサ出力を有効にするには

この手順に従って、デバッグするソース ファイルの出力ファイルを作成します。プリプロセッサ出力ファイルのファイル拡張子は .pp です。

  1. [Pre-Processors] タブをクリックします。
  2. [Preprocessor (Macro)] グループで、[Macro preprocessor output] の値を [Yes] に設定します。
  1. デバッグするプロジェクトを含むソリューションを開きます。
  2. アプリケーション エクスプローラー ビュー で、プロジェクトを右クリックし、[Micro Focus > Project Settings > PL/I Compile Settings > Macro Preprocessor] を選択します。[Properties] ウィンドウに [Macro Preprocessor] ページが表示されます。
  3. [Common macro preprocessor options > Additional options] で、「-pp outputfile」と入力します。outputfile には、出力ファイルの名前を指定します。

    出力ファイルを指定しない場合は、入力ファイル名が使用されます。詳細については、ヘルプ トピックの「マクロ プリプロセッサ オプション」を参照してください。

  4. [OK] をクリックして変更内容を保存します。
  5. プロジェクトをリビルドします。これにより、マクロ コードのデバッグに使用する出力ファイルが作成されます。

出力ファイルが作成された後については次のとおりです。F10 を押してコードにステップ インし、プリプロセッサ ファイルをデバッグします。CodeWatch デバッグ ウィンドウに、デバッグ対象ソースとしてプリプロセッサ ファイルが表示されます。この出力ファイルには、埋め込まれたマクロ コードが含まれています。

たとえば、プログラム ファイルに次のようなマクロ呼び出しを含む文があるとします。

    x = x + 1; x = x + 2;

    $PGMSG(ADD10);   
    $PGMSG(ADD20);

出力ファイルには、これらのマクロ呼び出しのコードが次のように埋め込まれます。

    x = x + 1; x = x + 2;

      DO;
              /* Tracing Block for: ADD10 */
              put skip list (PreExecution: ADD10");
              call ADD10(x);
              put skip list (Complete: ADD10");
              put skip;
            END;
      DO;
              /* Tracing Block for: ADD20 */
              put skip list (PreExecution: ADD20");
              call ADD20(x);
              put skip list (Complete: ADD20");
              put skip;
            END;

このコードにステップ インし、他のコードと同様にデバッグすることができます。