当我调用我的Perl调试器时perl -d myscript.pl
,调试器启动,但是在我按下n
(下一个)或c
(继续)之前它不会执行任何代码.
无论如何都要调用调试器并让它默认运行代码直到遇到断点?
如果是这样,是否有任何语句可以在我的代码中用作断点,以使调试器在它到达时停止?
这是我在.perldb
文件中的内容:
print "Reading ~/.perldb options.\n";
push @DB::typeahead, "c";
parse_options("NonStop=1");
Run Code Online (Sandbox Code Playgroud)
这是我的hello_world.pl
档案:
use strict;
use warnings;
print "Hello world.\n";
$DB::single=1;
print "How are you?";
Run Code Online (Sandbox Code Playgroud)
以下是运行的调试会话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>
Run Code Online (Sandbox Code Playgroud)
换句话说,我的调试器会跳过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
Run Code Online (Sandbox Code Playgroud)
mob*_*mob 12
放
$DB::single = 1;
Run Code Online (Sandbox Code Playgroud)
在任何在代码中设置永久断点的语句之前.这也适用于编译时代码,并且可能是在编译阶段设置断点的唯一好方法.
要让调试器自动启动代码,您可以在代码@DB::typeahead
中的.perldb
文件或编译时BEGIN
块()中操作数组.例如:
# .perldb file
push @DB::typeahead, "c";
Run Code Online (Sandbox Code Playgroud)
要么
BEGIN { push @DB::typeahead, "p 'Hello!'", "c" }
...
$DB::single = 1;
$x = want_to_stop_here();
Run Code Online (Sandbox Code Playgroud)
"NonStop"
您还可以.perldb
在PERLDB_OPTS
环境变量中或中设置一个选项:
PERLDB_OPTS=NonStop perl -d myprogram.pl
Run Code Online (Sandbox Code Playgroud)
所有这些(以及更多)是的肠子深入探讨perldebug
和perl5db.pl
解决最近更新中提出的问题.使用以下内容./perldb
:
print "Reading ~/.perldb options.\n";
push @DB::typeahead, "c";
parse_options("inhibit_exit=0");
Run Code Online (Sandbox Code Playgroud)