我有一个Perl脚本(在VirtualBox中运行的Xubuntu Lucid Lynx上),它包装了几个C/C++二进制文件,将一个程序的输出作为另一个程序的输入。其中一行通常如下:
my $ret_code=`cat $input | c_binary`;
my $ret_val= $?;
对于一些输入文件,代码会导致核心转储,但$ret_val
和$ret_code
分别为0和""。当我运行它时,我可以看到错误消息滚动,但好像没有办法在程序中"捕获"这些错误。 我该如何做? 目的是在出错时从输入中删除一些行并重试解析。
以下是错误消息:
*** stack smashing detected ***: code/parser terminated
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x50)[0x798390]
/lib/tls/i686/cmov/libc.so.6(+0xe233a)[0x79833a]
code/parser[0x804edd8]
[0x2e303039]
======= Memory map: ========
0043b000-0043c000 r-xp 00000000 00:00 0 [vdso]
0045a000-00475000 r-xp 00000000 08:01 11041 /lib/ld-2.11.1.so
00475000-00476000 r--p 0001a000 08:01 11041 /lib/ld-2.11.1.so
00476000-00477000 rw-p 0001b000 08:01 11041 /lib/ld-2.11.1.so
006b6000-00809000 r-xp 00000000 08:01 10897 /lib/tls/i686/cmov/libc-2.11.1.so
00809000-0080a000 ---p 00153000 08:01 10897 /lib/tls/i686/cmov/libc-2.11.1.so
0080a000-0080c000 r--p 00153000 08:01 10897 /lib/tls/i686/cmov/libc-2.11.1.so
0080c000-0080d000 rw-p 00155000 08:01 10897 /lib/tls/i686/cmov/libc-2.11.1.so
0080d000-00810000 rw-p 00000000 00:00 0
008ba000-008d7000 r-xp 00000000 08:01 8268 /lib/libgcc_s.so.1
008d7000-008d8000 r--p 0001c000 08:01 8268 /lib/libgcc_s.so.1
008d8000-008d9000 rw-p 0001d000 08:01 8268 /lib/libgcc_s.so.1
00c89000-00cad000 r-xp 00000000 08:01 10901 /lib/tls/i686/cmov/libm-2.11.1.so
00cad000-00cae000 r--p 00023000 08:01 10901 /lib/tls/i686/cmov/libm-2.11.1.so
00cae000-00caf000 rw-p 00024000 08:01 10901 /lib/tls/i686/cmov/libm-2.11.1.so
08048000-08055000 r-xp 00000000 08:01 407893 /home/abugorsk/Documents/code/stepbystep/collins-parser/code/parser
08055000-08056000 r--p 0000c000 08:01 407893 /home/abugorsk/Documents/code/stepbystep/collins-parser/code/parser
08056000-08057000 rw-p 0000d000 08:01 407893 /home/abugorsk/Documents/code/stepbystep/collins-parser/code/parser
08057000-0c50f000 rw-p 00000000 00:00 0
0e168000-0fa57000 rw-p 00000000 00:00 0 [heap]
b44a3000-b77c9000 rw-p 00000000 00:00 0
b77da000-b77dc000 rw-p 00000000 00:00 0
bff2b000-bff40000 rw-p 00000000 00:00 0 [stack]
Aborted
返回的值如下:
LOG: Parser return code: 0
LOG: Parser return value:
实际的代码片段如下:
my $command = "cd $STEPBYSTEP_HOME/collins-parser; cat models/model$model_num/events | code/parser $src models/model$model_num/grammar 10000 1 1 1 1 1> $dest 2> $parse_log";
llog "Executing command: $command";
my $ret_code = $?;
llog "Parser return code: $ret_code";
my $ret_val = `$command`;
my $ret_code = $?
。 - noscat $FILE | cmd
几乎总是会引入一个多余的进程。请改用cmd < $FILE
。 - pilcrow