打电话解冻投掷分段故障

kal*_*ief 1 perl segmentation-fault freeze-thaw

我正在使用该 FreezeThaw模块将序列化对象从客户端发送到服务器.它对于具有有限数量的条目的数组引用工作正常,但是当我对更大的祝福对象数组执行相同操作时,服务器正在停止

分段故障(核心转储)

以下是我正在使用的内容

客户:

my $message = freeze $_[1]; # encode_json
$mq->publish($channel_id, $routing_key, $message);
Run Code Online (Sandbox Code Playgroud)

服务器:

my $message  = $payload->{body} ;
my @got = thaw $message;
print Dumper(@got);
Run Code Online (Sandbox Code Playgroud)

当我使用下面的数组引用它到达服务器,但在打印后立即停止,服务器停止时出现分段错误错误.

$VAR1 = [
          [
            bless( {
                     'oidptr' => bless( do{\(my $o = '140488241049968')}, 'netsnmp_oidPtr' )
                   }, 'NetSNMP::OID' ),
            '600',
            67
          ],

... approximately 200 lines repeated
Run Code Online (Sandbox Code Playgroud)

mob*_*mob 5

冻结/解冻不适用于NetSNMP::OID对象.

NetSNMP::OID使用XS代码.XS代码在C中分配数据结构,并使该数据的地址在Perl中可用.存储在Perl的对象唯一的数据,并且被保存并与恢复的唯一数据freezethaw,是该地址.该地址的内容将无法跨进程或跨不同计算机上的客户端 - 服务器边界生存.

发生崩溃是因为服务器采用基本上是随机存储器地址的东西,并试图将其理解为netsnmp_oid_t数据结构.

您将不得不想出另一种方法来访问和序列化NetSNMP::OID对象的实际内容.