OpenCOBOLでdebugヽ(´ー`)ノOpenCOBOL 1.1は便利ですよ
OpenCOBOL用に書いた、または他のCOBOL実装から持ってきたコードのdebugをする際に知っておくと大変便利な話いろいろ。
OpenCOBOL forum: debug with gdbでも取り上げられていますが、
OpenCOBOL 1.1にて --ftraceallや --ftrace オプション(または -g )をつけてcobcコマンドを実行すると吐かれた実行ファイル(または *.so 動的ライブラリファイル)に cob_set_location関数が埋め込まれます。これは処理の各行に埋め込まれ「これから実行する処理は元のCOBOLソースのどの位置か?」について情報を内部変数に保存します。
さらに、内部変数 cob_line_trace が1のとき(cob_ready_trace()が呼ばれているとき/ --ftraceall、--ftrace 時)は現在実行中の処理行についての情報を標準エラー出力へ出力します。自動的にprintfデバッグできるわけですね(-gの場合は、cb_flag_source_location = 1 だけ行われるため、cob_set_location関数はプログラム中に埋め込まれますが、トレース表示はされません)。
void
cob_set_location (const char *progid, const char *sfile, const unsigned int sline,
const char *csect, const char *cpara, const char *cstatement)
{
cob_current_program_id = progid;
cob_source_file = sfile;
cob_source_line = sline;
cob_current_section = csect;
cob_current_paragraph = cpara;
if (cstatement) {
cob_source_statement = cstatement;
}
if (cob_line_trace) {
fprintf (stderr, "PROGRAM-ID: %s \tLine: %d \tStatement: %s\n",
(char *)progid, sline, cstatement ? (char *)cstatement : "Unknown");
fflush (stderr);
}
}void
cob_ready_trace (void)
{
cob_line_trace = 1;
}void
cob_reset_trace (void)
{
cob_line_trace = 0;
}
実行結果ですが:
[root@po SAMPLE]# cobc --ftraceall SICB0515
[root@po SAMPLE]# cobcrun SICB0515
PROGRAM-ID: SICB0515: ENTRY SICB0515
PROGRAM-ID: SICB0515: MAIN SECTION
PROGRAM-ID: SICB0515: MAIN-RTN
PROGRAM-ID: SICB0515 Line: 290 Statement: PERFORM
PROGRAM-ID: SICB0515: OPEN-RTN
PROGRAM-ID: SICB0515 Line: 308 Statement: INITIALIZE
PROGRAM-ID: SICB0515 Line: 309 Statement: INITIALIZE
PROGRAM-ID: SICB0515 Line: 313 Statement: MOVE
Segmentation fault
[root@po SAMPLE]#