我正在尝试调试我从Perl得到的段错误。
我正在使用:
- 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,它在行中出现段错误:
my $self = $class->_new;
段错误之后的输出没有帮助:
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;nnus"..., 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(我别无选择)。
PSIAlt建议的方法gdb
输出:
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)
所以,没有太多帮助...
同样,我真正的问题是"下一步是什么?
Ubuntu 12.10 x86_64,perl 5.8.8(由perlbrew编译),libssh2 1.4.2,openssl 1.0.1c和Net::SSH2 0.46下对我有用。
在Unix/Linux下,Net::OpenSSH可能是更好的选择。它甚至可以通过Net::OpenSSH::Compat模拟大部分Net::SSH2 API。