6

当我用 调用我的 Perl 调试器时,调试器启动,但在我按下(next) 或(continue)perl -d myscript.pl之前它不会执行任何代码。nc

无论如何调用调试器并让它在默认情况下运行代码直到它遇到断点?

如果是这样,是否有任何语句可以在我的代码中用作断点以使调试器在遇到它时停止?

更新:

这是我的.perldb文件中的内容:

print "Reading ~/.perldb options.\n";
push @DB::typeahead, "c";
parse_options("NonStop=1");

这是我的hello_world.pl文件:

use strict;
use warnings;

print "Hello world.\n"; 
$DB::single=1;
print "How are you?";

这是运行中的调试会话perl -d hello_world.pl::

Reading ~/.perldb options.
Hello world
main::(hello_world.pl:6):       print "How are you?";
auto(-1)  DB<1> c
Debugged program terminated.  Use q to quit or R to restart,
  use o inhibit_exit to avoid stopping after program termination,
  h q, h R or h o to get additional info.  
  DB<1> v
9563    9564    
9565    sub at_exit {
9566==>     "Debugged program terminated.  Use `q' to quit or `R' to restart.";
9567    }
9568    
9569    package DB;    # Do not trace this 1; below!
  DB<1> 

换句话说,我的调试器跳过print "How are you?",而是在程序完成后停止,这不是我想要的。

我想要的是让调试器运行我的代码而不会在任何地方停止(也不是在脚本的开头,也不是在脚本的结尾),除非我明确有一个$DB::single=1;语句,在这种情况下我希望它在运行下一行之前停止。有什么方法可以做到这一点?

作为参考,我正在使用:

$perl --version 

This is perl 5, version 14, subversion 1 (v5.14.1) built for x86_64-linux
4

2 回答 2

12

$DB::single = 1;

在您的代码中设置永久断点的任何语句之前。这也适用于编译时代码,并且可能是在编译阶段设置断点的唯一好方法。


要让调试器自动启动您的代码,您可以在文件或代码中的编译时 ( ) 块中操作@DB::typeahead数组。例如:.perldbBEGIN

# .perldb file
push @DB::typeahead, "c";

或者

BEGIN { push @DB::typeahead, "p 'Hello!'", "c" }
...
$DB::single = 1;
$x = want_to_stop_here();

您还可以在环境变量中设置一个"NonStop"选项:.perldbPERLDB_OPTS

PERLDB_OPTS=NonStop perl -d myprogram.pl

所有这些(以及更多)都在内心深处进行了perldebug讨论perl5db.pl

更新:

解决最近更新中提出的问题。在 中使用以下内容./perldb

print "Reading ~/.perldb options.\n";
push @DB::typeahead, "c";
parse_options("inhibit_exit=0");
于 2013-05-02T19:08:29.560 回答
2

另请查看Enbugger。关于调试器的主题,请参阅也适用于 Enbugger的Devel:: Trepan。

于 2013-05-06T13:11:50.927 回答