perl的Devel :: ebug如何

首先我想道歉,如果我误解了Devel :: ebug的整个概念和它应该如何使用。 所以我想用Devel :: ebug perl模块做一些实验。 在这里我find了一些例子: 什么是一个bash -xv的perl等价物所以我拿下面的代码并修改了一下。 根据官方文档Devel :: ebug CPAN程序方法select加载哪个程序,所以这只是我已经改变的东西。

#!/usr/bin/perl use strict; use warnings; use Devel::ebug; use Data::Dumper; my $ebug = Devel::ebug->new; # $ebug->program(shift); # OLD VALUE: $ebug->program($ARGV[0]); # NEW VALUE: $ebug->load; until ($ebug->finished) { print "+++ file:", $ebug->filename, " line: ", $ebug->line, "\n"; my $pad = $ebug->pad; for my $var (sort keys %$pad) { if (ref $pad->{$var}) { for my $line (split /\n/, Data::Dumper->Dump([$pad->{$var}], [$var])) { print "++ $line\n"; } } else { print "++ $var = $pad->{$var}\n"; } } for my $line ($ebug->codelines($ebug->line-3 .. $ebug->line-1)) { next unless defined $line; print "+ $line\n"; } print "+> ", $ebug->codeline, "\n"; for my $line ($ebug->codelines($ebug->line+1 .. $ebug->line+3)) { next unless defined $line; print "+ $line\n"; } $ebug->step; } 

然后我将这个文件保存为:stacktrace.pl在同一个目录中我也有文件:debugme.pl从什么是一个bash-xv页面的perl等价物 。 但是而不是输出上提到什么是一个bash-xv页面的perl等价物我得到这个:

 > ./stacktrace.pl debugme.pl ./stacktrace.pl: exec failed: No such file or directory at /home/wakatana/perl5/lib/perl5/Devel/ebug.pm line 41 Could not connect: Connection refused at /home/wakatana/perl5/lib/perl5/Devel/ebug.pm line 71. 

一些进一步的debugging指出了这一点:

 Proc::Background::Unix::_new(/home/wakatana/perl5/lib/perl5/Proc/Background/Unix.pm:47): 47: if ($pid = fork()) { DB<7> s Proc::Background::Unix::_new(/home/wakatana/perl5/lib/perl5/Proc/Background/Unix.pm:49): 49: $self->{_os_obj} = $pid; ######### Forked, but do not know how to create a new TTY. ######### Since two debuggers fight for the same TTY, input is severely entangled. I know how to switch the output to a different window in xterms, OS/2 consoles, and Mac OS X Terminal.app only. For a manual switch, put the name of the created TTY in $DB::fork_TTY, or define a function DB::get_fork_TTY() returning this. On UNIX-like systems one can get the name of a TTY for the given window by typing tty, and disconnect the shell from TTY by sleep 1000000. Proc::Background::Unix::_new(/home/wakatana/perl5/lib/perl5/Proc/Background/Unix.pm:54): 54: exec @_ or croak "$0: exec failed: $!\n"; 

首先,我认为这是因为我在GNU屏幕下运行它,不知何故,它无法创build新的TTY。 但这不是问题。 我在这里错过了什么?

PS:似乎在使用以下debugging器命令获得输出I时使用Proc :: Background :: Unix模块时出现问题:

 b Proc::Background::Unix::_new c 

编辑:关于@Chankey Pathak评论。 我在终止者下发布了这个命令。 在xterm下情况是一样的:

 > echo $$ 18548 > ps -elf | grep 18548 0 S wakatana 18548 18546 0 80 0 - 6296 - 16:09 pts/5 00:00:00 bash 0 R wakatana 18990 18548 0 80 0 - 4209 - 16:10 pts/5 00:00:00 ps -elf 0 R wakatana 18991 18548 0 80 0 - 1958 - 16:10 pts/5 00:00:00 grep 18548 > ps -elf | grep 18546 0 S wakatana 18546 18254 0 80 0 - 17220 - 16:09 pts/3 00:00:00 xterm 0 S wakatana 18548 18546 0 80 0 - 6296 - 16:09 pts/5 00:00:00 bash 0 R wakatana 19004 18548 0 80 0 - 1959 - 16:10 pts/5 00:00:00 grep 18546 > perl stacktrace.pl debugme.pl stacktrace.pl: exec failed: No such file or directory at /home/wakatana/perl5/lib/perl5/Devel/ebug.pm line 41 Could not connect: Connection refused at /home/wakatana/perl5/lib/perl5/Devel/ebug.pm line 71. 

编辑2:我已经交叉贴在perlmonks上

好吧,Devel :: ebug的工作原理是这样的:有一个控制进程监听套接字(这是上面粘贴的脚本)并执行调试器的“用户界面”位。 然后是你正在尝试调试的脚本,控制进程启动,并告诉它加载Devel :: ebug调试器,并且脚本执行它通过套接字与控制脚本进行交谈,以确定如何去除它。

我认为这个问题是因为控制Deve :: ebug有问题执行您的程序进行调试。 看看Devel :: ebug的第41行,我们看到:

 my $backend = $self->backend || "$Bin/ebug_backend_perl"; my $command = "$backend $program";; my $proc = Proc::Background->new( {'die_upon_destroy' => 1}, $command ); 

它看起来像->backend应该包含的路径,将执行您的脚本与正确的命令行标志,以便它启动在进程调试程序配置为通过套接字谈论上述控制程序。

这个模块安装了ebug_backend_perl ,可以帮你处理这个工作。 我认为你应该$ebug->backend($path)是在调用$ebug->load之前(如果我猜对的话可能是/home/wakatana/perl5/bin/ebug_backend_perl在你的系统上)