首先,如果我误解了Devel::ebug的整个概念以及应该如何使用它,我想向您道歉。所以我想用Devel::ebug perl模块做一些实验。我在这里找到了一些例子:What is the perl equivalent of a bash -xv,所以我采用了下面的代码,并对其进行了一些修改。根据官方文档,Devel::ebug CPAN方法选择要加载的程序,因此这是我唯一更改的内容。
#!/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,与What is the perl equivalent of a bash -xv页面中的file: debugme.pl相同的目录。但我得到的不是What is the perl equivalent of a bash -xv页面上提到的输出,而是:
> ./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.一些进一步的调试指出了这一点:
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屏幕下运行它,但不知何故它无法创建新的TTY。但这不是问题所在。我在这里错过了什么?
PS:在使用Proc::Background::Unix模块时似乎出现了问题,所以上面的输出是我使用以下调试器命令获得的:
b Proc::Background::Unix::_new
c编辑:关于@Chankey Pathak的评论。我在terminator下发出了这个命令。在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.EDIT2:我也在perlmonks上交叉发布了这篇文章
发布于 2014-08-07 02:50:18
好的,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->load之前,您应该$ebug->backend($path)到它所在的位置(如果我猜对了,可能是您系统上的/home/wakatana/perl5/bin/ebug_backend_perl )
https://stackoverflow.com/questions/24097763
复制相似问题