我知道我可以使用w
命令为变量和表达式添加监视,是否可以告诉它只是解析每个命令并停止该命令中是否有某段文本?
像w m/bad command/
这样的地方$_
是一个包含正在执行的下一个命令的字符串。
我正在Windows上使用Komodo进行远程CGI调试,但我也可以在linux shell上使用perl -d
。
更新:
我会尽量让这个更清楚。有一个文件,磁盘上的数据被删除,我不知道在哪里。我正在调试的程序包含许多彼此需要的.pl文件,而且完整的代码库甚至更大。我当然可以通过这个来获取数据文件名称的一部分(我知道扩展名)或unlink
。但是因为我不知道我的程序正在使用哪些代码文件,所以这不会让我走得太远。
让我们考虑一下这段代码,它将被调试:
if ($foo == 1) {
unlink 'filename.example';
}
现在当我正在调试时,如果下一个即将执行的perl命令(来自脚本)包含/example/
,我希望调试器停止。我想要一种在执行下一个命令之前运行的钩子。
这样,我不需要知道 where (就像在哪一行或文件中)我想要破解的东西,我也不需要变量名称(因为那里)没有)。
我知道这很难解释,但我认为这可能是一个常见的问题。也许完全有另一种方法?
答案 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)
答案 4 :(得分:-1)
查看Tie::Trace
,它可以提醒您变量值的更改位置。我想你甚至可以使用$DB::single=1
表达式来破解它,以便每次变量的值发生变化时都在调试器中中断。