我一直在从具有Perl 5.10的rhel6服务器迁移到具有rhel8和perl 5.24和5.26的服务器。
一切正常,除了一个Perl程序在执行警告语句时崩溃。
使用内置的调试器,将错误跟踪到下面的行。输入n来结束子例程,终止执行。
File::Temp::cleanup(/usr/share/perl5/vendor_perl/File/Temp.pm:934):
934: @{ $dirs_to_unlink{$$} } = ()
DB<44> n
带有警告语句失败的子函数是:
sub add_rec_to_db {
my $info = shift;
# Returns (errorcode, errormsg). No errorcode means GOOD.
my $af_rec = Logs::stats_transform($info);
my $lpd = Logs::db_lpd();
my $db_file = "$lpd/persistent.db";
my $dbh = LogsCommon::open_db($db_file);
my $err = LogsCommon::sql_insert_or_update($dbh, $af_rec, 'all_recs', 'FID');
if ($err) {
if ($err =~ /database is locked/) {
return "DATABASE_IS_LOCKED";
}
$err = strip_special_chars($err);
warn "AddRecToDb: FID=$info->{REC_ID} UNRECOGNIZED_DB_ERROR: $err";
return "UNRECOGNIZED_DB_ERROR";
}
return undef;
}
如果我更改参数,Perl程序将执行而没有错误,因此它不会运行此部分代码。 DBI和DBD似乎已安装并且可以正常工作。即使对于崩溃的子函数,代码也会执行应有的操作,直到warn语句为止。执行警告语句后,它应返回“ UNRECOGNIZED_DB_ERROR”。
使用模块流从Perl 5.26切换到5.24不能解决此问题。
答案 0 :(得分:1)
由于Carp设置,程序退出:
use Carp qw(confess);
$SIG{__DIE__} = \&confess;
$SIG{__WARN__} = \&confess;
它没有在Rhel 6服务器上退出,因为未引发$ err变量。如果无法确定为什么在Rhel8服务器上而不是Rhel6服务器上提高了$ err,我将发布一个新问题。