(開発5)デバッグ手順

# <u>■概略</u>
オープンソースエンジニア歴30年超の筆者が2023年からIBMiを学びだした学習記録です
開発ではコンパイル後はデバッグを行いますが、オープンソース環境では一般的な
デバッグプリントがIBMiでは標準入出力がないのでできません
5250を使わずに(=スプールファイルを使わずに)、VSCodeからデバッグプリントする
方法を考えました

## <u>■RPGLE/FFRPGでのデバッグプリント</u>
RPGでは標準入出力は外部ライブラリを使わないと(CGI編で解説)使えない  
そこでデバッグプリントを実装するために以下の方法を取った  
・dsply関数の実行時にメッセージキュー(自分用)を指定する  
・bashでプログラム実行後に、最新メッセージキューをn個表示する
　bashスクリプトを用意する  
・dsply時に時間表示を追加するようdebug関数にする  
・CGIで生成したSQLのように40文字を超える内容をデバッグプリントしたい場合は、
　プログラムが稼働するようになってからCGIでブラウザ画面上に表示するとよい

### <u>◯メインプログラム</u>
test.ffrpg  
```
**free
ctl-opt main(main);
ctl-opt text('テスト');

/include ./prototype.ffrpg

dcl-proc main;
    debug('abcd' : '{ユーザ名}');
end-proc;
```
※debug関数
debug(エラー文字列, メッセージキュー名);   
　エラー文字列は最大40文字。dsply命令の制限  
　メッセージキュー名はユーザ名  

### <u>◯protytype.ffrpg</u>
サービスプログラムを利用する場合は外部定義された関数名、パラメータを定義する  
サービスプログラム側でも定義が必要なので、prototype.ffrpgを外出しにして共通化し  
その上でincludeする。C言語のincludeと考え方は同じか…  
  
prototype.ffrpg  
```
**free
// デバッグプリント
dcl-pr debug;
    message varchar(40) const; // デバッグ表示する文字列
    msgq    varchar(10) const; // 出力先メッセージキュー
end-pr;
```

### <u>◯サービスプログラム(debug関数)</u>
何度か実行した時にメッセージの区別がつくように現在時刻を表示している  

debug.ffrpg  
```
**free
ctl-opt nomain;
ctl-opt text('commonlib_debug');

/include ./prototype.ffrpg

// デバッグプリント
// 表示メッセージは40桁まで
dcl-proc debug export;
    dcl-pi *N;
        message varchar(40) const; // デバッグ表示する文字列
        msgq    varchar(10) const; // 出力先メッセージキュー
    end-pi;

    dcl-s dt date(*JIS);
    dcl-s tm time(*JIS);
    dcl-s timestamp varchar(19);
    dcl-s debug varchar(50);

    dt  = %DATE();
    tm  = %TIME();
    //timestamp = %CHAR(dt) + ' ' + %CHAR(tm); // 日付もいれると長い
    timestamp = %CHAR(tm);
    debug = '[' + timestamp + ']' + message;
    dsply debug msgq;
end-proc;
```

コンパイル方法は[「複雑なコンパイル」](https://qiita.com/takami_embomajp/items/d07dd17829fb70c826d2) を参照してください

### <u>◯実行シェルスクリプト</u>
call_TEST.bash  
```
#!/bin/bash
USER=`whoami`
#----
PGM='TEST'
TARGET_LIB=${USER}"LIB"
#----
# プログラム実行
system "CALL PGM(${TARGET_LIB}/${PGM})"
# 最新のdsplyを10行表示する
system "dspmsg msgq(${USER})" 2>&1 |grep DSPLY|tail -10
```

### <u>◯実行結果</u>
```
te001@T70FC850:~/JHDEL/cmd$ ./call_TEST.bash
 RNI5334  00  情報       DSPLY  [16:26:30]abcd
te001@T70FC850:~/JHDEL/cmd$ ./call_TEST.bash
 RNI5334  00  情報       DSPLY  [16:26:30]abcd
 RNI5334  00  情報       DSPLY  [16:26:43]abcd
te001@T70FC850:~/JHDEL/cmd$ ./call_TEST.bash
 RNI5334  00  情報       DSPLY  [16:26:30]abcd
 RNI5334  00  情報       DSPLY  [16:26:43]abcd
 RNI5334  00  情報       DSPLY  [16:26:44]abcd
```

## <u>■ステップ実行(未稼働)</u>
IBM DebuggingをVSCodeで使える=ステップ実行ができるらしい  

◯参考URL  
※VSCodeに組み込んでいるCode for IBMi公式URLのDebuggingの部分(英語)  
　https://codefori.github.io/docs/#/pages/developing/debug/debug?id=starting-to-debug  
※VSCodeでIBMi Debuggerを利用する方法(英語)  
　https://www.itjungle.com/2023/02/15/ibm-i-debugger-comes-to-vs-code/  
  
そのためには以下のPTFが必要らしい 
IBM i 7.4 PTF SI80364 and SI81031  
IBM i 7.4 PTF SI83683 and SI81031  
  
以下で3つのPTF番号を調べても一時的に適用で当たっている   
DSPPTF LICPGM(5770SS1) SELECT(PTF番号)  
  
しかし以下のようにデバッグボタンを押してもPTFが当たっていないとエラーになる  
原因不明です…  
誰か動作するやり方がわかったら教えてください…

![develop_debug01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/472755fe-9419-fcc9-ed9f-0fb33fb0edcb.png)