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

Perl code crashes after upgrading from rhel6 to rhel8

我一直在从装有 Perl 5.10 的 rhel6 服务器迁移到装有 rhel8 和 perl 5.24 和 5.26 的服务器。

除了一个 Perl 程序在执行 warn 语句时崩溃外,一切正常。

使用内置的调试器,我将错误追踪到以下行。输入 n 以跳过子例程终止执行。

File::Temp::cleanup(/usr/share/perl5/vendor_perl/File/Temp.pm:934):
934: @{ $dirs_to_unlink{$$} } = ()
DB<44> n

warn语句失败的子函数是:

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 语句。执行warn语句后,应该return "UNRECOGNIZED_DB_ERROR".

使用模块流从 Perl 5.26 切换到 5.24 未能解决此问题。

由于 Carp 设置程序退出:

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

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