从 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 一个新问题。
我一直在从装有 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 一个新问题。