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 を使用しなければならないということです (私には選択の余地がありません)。
gdb
PSIAlt によって提案された方法からの出力:
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)
だから、あまり役に立ちません...
繰り返しますが、私の本当の質問は「次は何ですか?」です。