0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

(開発5)デバッグ手順

Last updated at Posted at 2024-09-08

■概略

オープンソースエンジニア歴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が当たっていないとエラーになる
原因不明です…
誰か動作するやり方がわかったら教えてください…

develop_debug01.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?