Recent Entries
Archives
Search


Links
Powered by
Movable Type 2.64

2008年08月01日

OpenCOBOLでdebug

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]#


という感じです(´ー`)。Line:313を実行後にSegmentation faultが発生しているのがわかりますね(原因は集団項目のサイズ分確保しない状態でSICB0515プログラムを呼び出したことでした)。PROCEDUREを外部からCALLで呼んでいるのにUSING以降に指定した変数に十分な長さの領域を確保して渡していないと… MOVE時に変数の領域外から読みだそうとして Signal 11が発生することもあります。

Posted by minemaz at 2008年08月01日 12:47
トラックバック
このエントリーのトラックバックURL:
http://www.lancard.com/mt/mt-tb.cgi/448

Comments
Post a comment









Remember personal info?