如何将工作断点设置为常量表达式?

How can I set a working breakpoint to a constant expression?

我有一个 Perl 代码,它使用一个带有初始化块的常量,如下所示:

use constant C => map {
    ...;
} (0..255);

当我尝试...;行设置断点时,它不起作用,意思是:我可以设置 断点,但调试器 不会在那里停止

我试过了:

  1. 使用调试器启动程序(perl -d program.pl)
  2. 在调试器中设置断点(b 2)
  3. 使用 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