运行Perl调试器两次

时间:2014-08-27 06:48:22

标签: perl

我有一个案例,我两次调用Perl调试器。例如,progA.pl

use warnings;
use strict;

system("perl -d progB.pl");

progB.pl

use warnings;
use strict;
$DB::single=1;
print "Hello\n";

然后我运行progA.pl,如:

$ perl -d progA.pl

这不太好用。在我的系统(Ubuntu 14.04和Perl版本5.18)上,我从调试器中收到一些错误。例如:

  ###分叉,但不知道如何创建新的TTY。 #########由于两个调试器争用相同的TTY,因此输入非常严重      

纠缠。

     

我知道如何在xterms中将输出切换到另一个窗口,   OS / 2控制台和Mac OS X Terminal.app。对于手动开关,   将创建的TTY的名称放在$ DB :: fork_TTY中,或者定义一个   函数DB :: get_fork_TTY()返回此。

     

在类UNIX系统上,可以获得给定的TTY名称   通过键入tty窗口,并通过睡眠将shell与TTY断开连接   百万。

它还会尝试打开一个标题为Dauther Perl debugger的新终端窗口,但新终端仅显示错误sh: 1: 3: Bad file descriptor

如何避免这些问题?我只是希望调试器正常工作。

2 个答案:

答案 0 :(得分:1)

使用'do'代替'system'

perl -d progA.pl
# will stop after your $DB::single = 1 
# line in progB.pl

perldoc -f do

    do EXPR Uses the value of EXPR as a filename and executes the contents
            of the file as a Perl script.

                   do 'stat.pl';

               is just like

                   eval `cat stat.pl`;

答案 1 :(得分:1)

我不确定这是不是你想要的,因为我不了解你想要做的事情的大局。

但是如果你在开始时使用像Devel::Trepan这样的不同调试器,那么事情可能会有效:

$ trepan.pl progA.pl 
-- main::(progA.pl:4 @0x21282c8)
system("perl -d progB.pl");
(trepanpl): s
-- main::(progB.pl:3 @0x7042a8)
$DB::single=1;
(trepanpl): s
-- main::(progB.pl:4 @0x878be8)
print "Hello\n";
(trepanpl): s
Hello
Debugged program terminated.  Use 'q' to quit or 'R' to restart.
(trepanpl): quit
trepan.pl: That's all, folks...
Debugged program terminated.  Use 'q' to quit or 'R' to restart 
(trepanpl) quit
trepan.pl: That's all, folks...

“程序终止”消息后的(trepanpl)提示有点奇怪。但这里所说的就是progB.pl完成了。退出之后,如上所述,如果在 system()命令之后有另一个Perl语句,那么调试器会显示相反的第二个“已完成”消息。

Devel :: Trepan 的另一个特性是,您可以使用其debug command从该调试器内部进行嵌套调试。这是一个例子:

trepan.pl progA.pl 
-- main::(progA.pl:4 @0x10612c8)
system("perl -d progB.pl");
set auto eval is on.
(trepanpl): debug system("perl -d progB.pl")
-- main::((eval 1437)[/usr/local/share/perl/5.18.2/Devel/Trepan/DB/../../../Devel/Trepan/DB/Eval.pm:129] remapped /tmp/HSXy.pl:6 @0x51f13e0)
system("perl -d progB.pl")
((trepanpl)): s
-- main::(progB.pl:3 @0x9382a8)
$DB::single=1;
(trepanpl): s
-- main::(progB.pl:4 @0xaacbe8)
print "Hello\n";
(trepanpl): s
Hello
Debugged program terminated.  Use 'q' to quit or 'R' to restart.
(trepanpl): quit
trepan.pl: That's all, folks...
$DB::D[0] = 0
Leaving nested debug level 1
-- main::(progA.pl:4 @0x10612c8)
system("perl -d progB.pl");
(trepanpl):