如何将工作断点设置为常量表达式?
How can I set a working breakpoint to a constant expression?
我有一个 Perl 代码,它使用一个带有初始化块的常量,如下所示:
use constant C => map {
...;
} (0..255);
当我尝试在...;
行设置断点时,它不起作用,意思是:我可以设置 断点,但调试器 不会在那里停止 。
我试过了:
- 使用调试器启动程序(
perl -d program.pl
)
- 在调试器中设置断点(
b 2
)
- 使用
R
重新加载,然后 运行 (r
) 程序
但是调试器仍然没有停在该行,就像我没有设置断点一样。
我的 Perl 不是最新的;现在是 5.18.2,以防万一...
您正试图在 use
块中放置一个断点。
一个 use 块实际上是一个 BEGIN
块,里面有一个 require
。
默认情况下,Perl 调试器不会在编译阶段停止。
但是,您可以通过将变量 $DB::single
设置为 1
来强制 Perl 调试器在 BEGIN
块内进入单步模式
参见 perldoc perldebug
中的 Debugging Compile-Time Statements
如果您将代码更改为
use constant C => map {
$DB::single = 1;
...;
} (0..255);
Perl 调试器将在 use 语句中停止。
如果创建像这样的简单模块 (concept originated here):
,则可以避免更改代码
package StopBegin;
BEGIN {
$DB::single=1;
}
1;
然后,运行 您的代码为
perl -I./ -MStopBegin -d test.pl
中肯答案(前一个不太中肯的答案在这个下面)
如果 test.pl 看起来像这样:
use constant C => {
map {;
"C$_" => $_;
} 0 .. 255
};
这是调试交互的样子:
% perl -I./ -MStopBegin -d test.pl
Loading DB routines from perl5db.pl version 1.53
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
StopBegin::CODE(0x55db6287dac0)(StopBegin.pm:8):
8: 1;
DB<1> s
main::CODE(0x55db6287db38)(test.pl:5):
5: };
DB<1> -
1 use constant C => {
2: map {;
3: "C$_" => $_;
4 } 0 .. 255
5==> };
DB<2> b 3
DB<3> c
main::CODE(0x55db6287db38)(test.pl:3):
3: "C$_" => $_;
DB<3>
注意使用断点停在map
.
里面
上一个不太相关的答案
如果 test.pl
看起来像这样:
my $foo;
BEGIN {
$foo = 1;
};
这是调试交互的样子:
% perl -I./ -MStopBegin -d test.pl
Loading DB routines from perl5db.pl version 1.53
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
StopBegin::CODE(0x5567e3d79a80)(StopBegin.pm:8):
8: 1;
DB<1> s
main::CODE(0x5567e40f0db0)(test.pl:4):
4: $foo = 1;
DB<1> s
main::(test.pl:1): my $foo;
DB<1> s
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>
注意使用s
命令前进,否则会跳过test.pl
中的BEGIN
块
我有一个 Perl 代码,它使用一个带有初始化块的常量,如下所示:
use constant C => map {
...;
} (0..255);
当我尝试在...;
行设置断点时,它不起作用,意思是:我可以设置 断点,但调试器 不会在那里停止 。
我试过了:
- 使用调试器启动程序(
perl -d program.pl
) - 在调试器中设置断点(
b 2
) - 使用
R
重新加载,然后 运行 (r
) 程序
但是调试器仍然没有停在该行,就像我没有设置断点一样。
我的 Perl 不是最新的;现在是 5.18.2,以防万一...
您正试图在 use
块中放置一个断点。
一个 use 块实际上是一个 BEGIN
块,里面有一个 require
。
默认情况下,Perl 调试器不会在编译阶段停止。
但是,您可以通过将变量 $DB::single
设置为 1
BEGIN
块内进入单步模式
参见 perldoc perldebug
Debugging Compile-Time Statements
如果您将代码更改为
use constant C => map {
$DB::single = 1;
...;
} (0..255);
Perl 调试器将在 use 语句中停止。
如果创建像这样的简单模块 (concept originated here):
,则可以避免更改代码package StopBegin;
BEGIN {
$DB::single=1;
}
1;
然后,运行 您的代码为
perl -I./ -MStopBegin -d test.pl
中肯答案(前一个不太中肯的答案在这个下面)
如果 test.pl 看起来像这样:
use constant C => {
map {;
"C$_" => $_;
} 0 .. 255
};
这是调试交互的样子:
% perl -I./ -MStopBegin -d test.pl
Loading DB routines from perl5db.pl version 1.53
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
StopBegin::CODE(0x55db6287dac0)(StopBegin.pm:8):
8: 1;
DB<1> s
main::CODE(0x55db6287db38)(test.pl:5):
5: };
DB<1> -
1 use constant C => {
2: map {;
3: "C$_" => $_;
4 } 0 .. 255
5==> };
DB<2> b 3
DB<3> c
main::CODE(0x55db6287db38)(test.pl:3):
3: "C$_" => $_;
DB<3>
注意使用断点停在map
.
上一个不太相关的答案
如果 test.pl
看起来像这样:
my $foo;
BEGIN {
$foo = 1;
};
这是调试交互的样子:
% perl -I./ -MStopBegin -d test.pl
Loading DB routines from perl5db.pl version 1.53
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
StopBegin::CODE(0x5567e3d79a80)(StopBegin.pm:8):
8: 1;
DB<1> s
main::CODE(0x5567e40f0db0)(test.pl:4):
4: $foo = 1;
DB<1> s
main::(test.pl:1): my $foo;
DB<1> s
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>
注意使用s
命令前进,否则会跳过test.pl
BEGIN
块