マクロ コードを含む PL/I プログラムのデバッグ

単純な PL/I マクロを使用するユーザーの大半は、根本的な 0 から n 行までの PL/I 文を生成できるとしても、元のソース内で実行可能なコードであるかのようにマクロをデバッグすることを好みます。これに対処するために、CodeWatch は、WYSIWYD (What You See Is What You Debug) エクスペリエンスを提供します。1 つのステップで、生成されたマクロ コードのすべての行が単一の PL/I 文であるかのように実行されます。単一行のコードが実行された場合と同様に、実行前後の変数値を照会できます。ただし、1 つのマクロで実行可能行のごく一部、1 行全体、または複数行を生成できる PL/I マクロ言語の性質のため、CodeWatch が常にそのような動作を提供できるわけではありません。そのような場合は、デバッグを容易にするために「PL/I プログラムの内部マクロコードのデバッグ」で説明されている手法を使用できます。

デフォルトでは、CodeWatch は PL/I プログラム内のマクロ コードをデバッグしません。マクロ コードを使用して PL/I プログラムをデバッグするとき、デバッガーは単純にマクロ呼び出しを含む行を介してデバッグします。

このコード サンプルには、複数のマクロ呼び出しが含まれています。

DEMO: PROC OPTIONS(MAIN);                                           

  dcl x fixed bin(31) init(0);
    
%DCL $PGMSG ENTRY;                                                     
%$PGMSG: PROC (PGM) STATEMENT RETURNS (CHAR);                          
  DCL  PGM    CHAR;  
  DCL  MSG    CHAR;
  DCL  SPACES CHAR;  
  /*  Uncomment following 2 lines to recreate RPI 1087809 */ 
  
  SPACES = '                                                            
           ';   
             
  msg = 
  '  DO; '   || spaces ||
  '    /* Tracing Block for: ' || pgm ||  ' */'         || spaces ||
  '    put skip list("Pre Execution: ' || pgm || '");'  || spaces ||
  '    call ' || pgm || '(x);'                          || spaces ||
  '    put skip list("Complete: ' || pgm || '"); '      || spaces ||      
  '    put skip; '                                      || spaces ||      
  '  END; '; 
  
   RETURN ( msg );                                      
%END $PGMSG;   

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

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

   x = x + 3;

   $PGMSG(SUBTRACT30);
   put skip data(x);
   
   $PGMSG(ADD10);   
   
   put skip data(x);

   /**********************************/
   /*  Start of Internal Procedures  */
   /**********************************/   
   
   /**********************/
     add10: proc(x);
   /**********************/     
       dcl x fixed bin(31); 
       put skip list('add10:  adding 10 to x');
       x = x + 10;
       put skip list('add10 (complete):  ' || x);
    
     end add10;

   /**********************/
     add20: proc(x);
   /**********************/     
       dcl x fixed bin(31);
       put skip list('add20:  adding 20 to x');       
       x = x + 20;
       put skip list('add20 (complete):  ' || x);       
    
     end add20;

   /**********************/
     subtract30: proc(x);
   /**********************/
       dcl x fixed bin(31);        
       put skip list('subtract30:  subtracting 30 from x');               
       x = x - 30;
       put skip list('subtract30 (complete):  ' || x);              
    
     end subtract30;

                                                                    
 END DEMO;

デバッグ中は、2 つのマクロ呼び出し行の前の行の 2 番目の文に次のように移動します。

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

F10 を押すと、コード内の次の文へのマクロ呼び出しがある行を介して、デバッグがステップ実行されます。

CodeWatch が PL/I プログラム内のマクロ コードを介してデバッグするとき、マクロ呼び出しを含む行はトップ レベルのマクロ コードで一切のデバッグなしに実行されます。ターミナル ウィンドウの出力には、値が派生して文が実行されたことが表示されます。これは、コードがデバッグされずにマクロ呼び出しが実行されたことを示します。

マクロを含むプログラム コードに CALL 文も含まれている場合は、CALL 文のコードをデバッグできます。これを行うには、文に対して実行するコードの最初の行にブレークポイントを配置します。F10 キーを押してブレークポイントに進みます。CodeWatch ウィンドウには、変数値やその他の値が表示されます。

たとえば、上記のコード サンプルには、(x) への呼び出しが含まれています。これは x から 30 を減算するための呼び出しです。コード サンプルのこの行にブレークポイントを配置すると、次のようになります。

put skip list('subtract30:  subtracting 30 from x');

F10 キーを押して行に入ると、変数値やその他の出力を確認できますが、マクロのトップ レベルでコードを表示することはできません。マクロ内部のデバッグについては、「PL/I プログラムの内部マクロコードのデバッグ」を参照してください。