2017-05-03 3 views
1

세그먼트 오류를 ​​던지는 해동합니다. 이 항목의 제한된 수의 배열 참조에 대한 잘 작동하지만, 내가 축복 오브젝트의 더 큰 어레이의 동일한 작업을 수행 할 때 서버는전화는 내가 클라이언트에서 서버로 직렬화 된 객체를 전송하기 위해 <a href="https://metacpan.org/pod/FreezeThaw" rel="nofollow noreferrer"><code>FreezeThaw</code></a> 모듈 을 사용하고

분할 오류 (코어 덤프)

으로 중지됩니다 아래는 내가 사용하고 무엇

클라이언트 :

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 
+0

"_ 인쇄 직후 _ 설명 할 수 있습니까?" 코드의 어느 시점에서 충돌이 발생합니까? 질문에서 '해동'이 잘 작동하는 것 같습니다 ...? 또한, 왜 '해빙'의 일반 배열에 할당하고 왜 'Dumper'(참조 여야 함)를 사용하여 일반 배열을 인쇄하고 있습니까? – zdim

+0

서버가 다른 컴퓨터에 있습니까? 그렇다면'nfreeze'를 사용해야합니다. – zdim

+0

개체가 클라이언트에서 직렬화되고 서버에서 역 직렬화되는 클래스가 동일하거나 충분히 호환되는 클래스입니까? – zdim

답변

5

동결/해빙은 NetSNMP::OID 개체에서 작동하지 않습니다.

NetSNMP::OIDXS code을 사용합니다. XS 코드는 C로 데이터 구조를 할당하고 해당 데이터의 주소를 Perl에서 사용할 수 있도록합니다. Perl 개체에 저장되는 유일한 데이터와 저장되고 복원되는 데이터는 freezethaw 인 유일한 주소입니다. 해당 주소의 내용은 다른 컴퓨터에서 프로세스 간 또는 클라이언트 - 서버 경계에서 생존하지 못합니다.

크래시는 서버가 기본적으로 임의의 메모리 주소 인 것을 취하고 netsnmp_oid_t data structure으로 이해하려고하기 때문에 발생합니다.

NetSNMP::OID 개체의 실제 내용을 액세스하고 일련 번호를 지정하는 다른 방법이 필요합니다.

+1

Storable은 클래스의 개체 고정 및 해동 방법을 정의하는 데 사용할 수있는 [후크] (http://search.cpan.org/perldoc?Storable#Hooks)를 제공합니다. – ikegami