从rhel6升级到rhel8后,Perl代码崩溃

时间:2019-06-19 20:19:45

标签: perl rhel

我一直在从具有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不能解决此问题。

1 个答案:

答案 0 :(得分:1)

由于Carp设置,程序退出:

use Carp qw(confess);
$SIG{__DIE__} = \&confess;
$SIG{__WARN__} = \&confess;

它没有在Rhel 6服务器上退出,因为未引发$ err变量。如果无法确定为什么在Rhel8服务器上而不是Rhel6服务器上提高了$ err,我将发布一个新问题。