1

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

分段错误(核心转储)

下面是我正在使用的

客户:

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

服务器:

my $message  = $payload->{body} ;
my @got = thaw $message;
print Dumper(@got);

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

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

... approximately 200 lines repeated
4

1 回答 1

5

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

NetSNMP::OID使用XS 代码。XS 代码在 C 中分配一个数据结构,并使该数据的地址在 Perl 中可用。存储在 Perl 对象中的唯一数据,以及唯一使用freezeand保存和恢复的数据thaw就是那个地址。该地址的内容将无法跨越进程或跨越不同机器上的客户端-服务器边界。

发生崩溃是因为服务器获取了一个基本上是随机内存地址的东西,并试图将其理解为一种netsnmp_oid_t数据结构

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

于 2017-05-03T05:42:41.667 回答