一旦代码行与Perl调试器中的正则表达式匹配,我该怎么办?

时间:2012-11-02 13:37:11

标签: perl debugging watch

我知道我可以使用w命令为变量和表达式添加监视,是否可以告诉它只是解析每个命令并停止该命令中是否有某段文本?

w m/bad command/这样的地方$_是一个包含正在执行的下一个命令的字符串。

我正在Windows上使用Komodo进行远程CGI调试,但我也可以在linux shell上使用perl -d


更新

我会尽量让这个更清楚。有一个文件,磁盘上的数据被删除,我不知道在哪里。我正在调试的程序包含许多彼此需要的.pl文件,而且完整的代码库甚至更大。我当然可以通过这个来获取数据文件名称的一部分(我知道扩展名)或unlink。但是因为我不知道我的程序正在使用哪些代码文件,所以这不会让我走得太远。

让我们考虑一下这段代码,它将被调试:

if ($foo == 1) {
  unlink 'filename.example';
}

现在当我正在调试时,如果下一个即将执行的perl命令(来自脚本)包含/example/ ,我希望调试器停止。我想要一种在执行下一个命令之前运行的钩子。

这样,我不需要知道 where (就像在哪一行或文件中)我想要破解的东西,我也不需要变量名称(因为那里)没有)。

我知道这很难解释,但我认为这可能是一个常见的问题。也许完全有另一种方法?

5 个答案:

答案 0 :(得分:5)

使用'w'命令设置观察点:

 BD<1>  w  $cannonballs
每次$ cannonballs改变时,

都会破坏程序。

 BD<1> w $i == 19
当$ i的值设置为19时,

将中断。例如

 $ cat  foo.pl 

 foreach $i ( 0..100 ) {
    print "$i\n";
 }

 $ perl -d foo.pl

 Loading DB routines from perl5db.pl version 1.28 Editor support available.

 Enter h or `h h' for help, or `man perldebug' for more help.

 main::(foo.pl:2):       foreach $i ( 0..100 ) {   
   DB<1> w $i == 3   
   DB<2> c 
 0 
 1 
 2 
 Watchpoint 0:   $i == 3 changed:
     old value:  ''
     new value:  '1' 
 main::(foo.pl:3):          print "$i\n";   
   DB<2> p $i 
 3   
   DB<3> q 
 Watchpoint 0:   $i == 3 changed:
     old value:  '1'
     new value:  '' 
   DB<3> q
 $

您可能希望使用变量的完整命名空间,否则任何时候任何具有相同名称的变量进入或超出范围都会中断。

答案 1 :(得分:3)

我不知道一个模块完全符合你的要求,但Devel::Trace是一个非常小的模块(20行代码),它在执行之前打印每一行。

您可以创建它的子类,并修改DB :: DB子例程以设置$ DB :: single = 1,如果代码与您想要的字符串匹配。

有关更详细的说明,请参阅brian d foy's post有关Devel :: Trace的详细信息。

答案 2 :(得分:0)

您可以使用

在代码中设置断点
$DB::single = 1;

要在手表配置中使用断点,请将中断括在与您要观看的内容匹配的条件中。

在你的情况下:

if ( $command =~ /example/ ) {
    $DB::single = 1;
}

应该服务。

答案 3 :(得分:-1)

调试器已经可以做到(好吧,差不多)。它不称为监视表达式,但它被称为断点

您可以将断点设置为行和条件:

b 33 /pattern/i

但是,您必须指定行号。请参阅Perl debugging

答案 4 :(得分:-1)

查看Tie::Trace,它可以提醒您变量值的更改位置。我想你甚至可以使用$DB::single=1表达式来破解它,以便每次变量的值发生变化时都在调试器中中断。