■概略
オープンソースエンジニア歴30年超の筆者が2023年からIBMiを学びだした学習記録です
開発ではコンパイル後はデバッグを行いますが、オープンソース環境では一般的な
デバッグプリントがIBMiでは標準入出力がないのでできません
5250を使わずに(=スプールファイルを使わずに)、VSCodeからデバッグプリントする
方法を考えました
■RPGLE/FFRPGでのデバッグプリント
RPGでは標準入出力は外部ライブラリを使わないと(CGI編で解説)使えない
そこでデバッグプリントを実装するために以下の方法を取った
・dsply関数の実行時にメッセージキュー(自分用)を指定する
・bashでプログラム実行後に、最新メッセージキューをn個表示する
bashスクリプトを用意する
・dsply時に時間表示を追加するようdebug関数にする
・CGIで生成したSQLのように40文字を超える内容をデバッグプリントしたい場合は、
プログラムが稼働するようになってからCGIでブラウザ画面上に表示するとよい
◯メインプログラム
test.ffrpg
**free
ctl-opt main(main);
ctl-opt text('テスト');
/include ./prototype.ffrpg
dcl-proc main;
debug('abcd' : '{ユーザ名}');
end-proc;
※debug関数
debug(エラー文字列, メッセージキュー名);
エラー文字列は最大40文字。dsply命令の制限
メッセージキュー名はユーザ名
◯protytype.ffrpg
サービスプログラムを利用する場合は外部定義された関数名、パラメータを定義する
サービスプログラム側でも定義が必要なので、prototype.ffrpgを外出しにして共通化し
その上でincludeする。C言語のincludeと考え方は同じか…
prototype.ffrpg
**free
// デバッグプリント
dcl-pr debug;
message varchar(40) const; // デバッグ表示する文字列
msgq varchar(10) const; // 出力先メッセージキュー
end-pr;
◯サービスプログラム(debug関数)
何度か実行した時にメッセージの区別がつくように現在時刻を表示している
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;
コンパイル方法は「複雑なコンパイル」 を参照してください
◯実行シェルスクリプト
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
◯実行結果
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
■ステップ実行(未稼働)
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が当たっていないとエラーになる
原因不明です…
誰か動作するやり方がわかったら教えてください…