3

Perl から取得したセグメンテーション違反をデバッグしようとしています。

私は使用しています:

  • パール 5.8.8
  • ネット::SSH2 0.45
  • libssh2 1.4.2
  • Openssl 0.9.8x (ただし、1.0.1c でも同じ問題が発生しました)

私が呼び出すと問題が発生します:

my $ssh = Net::SSH2->new();

Perl デバッガー ( perl -d) で実行し、Net::SSH2 にステップスルーすると、次の行で segfaults が発生します。

my $self = $class->_new;

segfault 後の出力は役に立ちません。

zsh: segmentation fault  perl -d ./test.pl

で実行すると、次のようにstrace終了します。

open("<snip>/perl/lib/perl5.8/Linux-2.6c2.5-x86_64-64int/Net/SSH2/Listener.pm", O_RDONLY) = 4
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffb9cdc920) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(4, 0, SEEK_CUR)                   = 0
read(4, "package Net::SSH2::Listener;\n\nus"..., 4096) = 804
lseek(4, 90, SEEK_SET)                  = 90
lseek(4, 0, SEEK_CUR)                   = 90
close(4)                                = 0
read(3, "", 4096)                       = 0
close(3)                                = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++

今、私は立ち往生しています。次に何をすればいいですか?何が間違っているかを調べるために、さらに深く掘り下げるにはどうすればよいですか?

私が変更できない唯一のことは、Perl 5.8.8 を使用しなければならないということです (私には選択の余地がありません)。


gdbPSIAlt によって提案された方法からの出力:

Program received signal SIGSEGV, Segmentation fault.
0x000000379ea141dc in __longjmp () from /lib64/ld-linux-x86-64.so.2
(gdb) bt
#0  0x000000379ea141dc in __longjmp () from /lib64/ld-linux-x86-64.so.2
#1  0x0101f58e4fc7bacc in ?? ()
Cannot access memory at address 0x101f58e475b223b
(gdb) 

だから、あまり役に立ちません...

繰り返しますが、私の本当の質問は「次は何ですか?」です。

4

1 に答える 1

1

Ubuntu 12.10 x86_64、perl 5.8.8(perlbrewでコンパイル)、libssh2 1.4.2、openssl 1.0.1c、Net ::SSH20.46で動作します。

Unix / Linuxでは、Net::OpenSSHがおそらくより良い選択です。Net :: OpenSSH::Compatを介してNet::SSH2APIのほとんどをエミュレートすることもできます。

于 2012-11-16T13:47:18.623 に答える