【问题标题】:How can I use Perl 5.10 features inside the debugger?如何在调试器中使用 Perl 5.10 功能?
【发布时间】:2011-04-02 04:02:09
【问题描述】:

我无法在 Perl 调试器中评估“现代 Perl”代码。调试文件中的代码时可以正常工作,但不能从提示符中调试。

小例子:

# Activating 5-10 features with -E (it works)
$  perl -E 'say "x"'
x
# 使用 -E 调用调试器 # 它适用于 infile 代码,但适用于提示行代码... $ perl -dEbug 从 perl5db.pl 1.33 版加载 DB 例程 数据库说“x” 在 (eval 16)[/local-perl/lib/5.12.1/perl5db.pl:638] 第 2 行,靠近“say”x“”的操作员预期的位置找到字符串 在 (eval 16)[/local-perl/lib/5.12.1/perl5db.pl:638] 第 2 行 eval '($@, $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop;说“x”;

(注意:“使用功能 ':5.10'”也是如此。)

我错过了什么吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

    我找到了对问题here 的引用,但它大约有一年的历史了。然而,Perl 源代码的相关部分从那时起就没有改变,可以在here 看到。本质上,如果您查看 Perl 源代码中的 toke.c,您会看到以下内容:

    if (PL_perldb) {
        /* Generate a string of Perl code to load the debugger.
         * If PERL5DB is set, it will return the contents of that,
         * otherwise a compile-time require of perl5db.pl.  */
    
        const char * const pdb = PerlEnv_getenv("PERL5DB");
                ...
    }
    ...
    if (PL_minus_E)
        sv_catpvs(PL_linestr,
              "use feature ':5." STRINGIFY(PERL_VERSION) "';");
    

    基本上,在处理-E 标志之前加载调试器,因此在加载调试器时这些功能尚未启用。要点是您目前不能将-E-d 命令一起使用。如果您想使用sayswitch 或调试提示符中的任何其他功能,您必须这样做:

      DB<1> use feature 'say'; say "x"
      x
    

    我见过的最接近解决方案的是:

    1. 将 perl5db.pl 从 PERL5LIB 复制到 PERL5LIB 中的某个位置或当前目录,使用不同的名称,例如 myperl5db.pl 2. 编辑 myperl5db.pl 以使用功能 ':5.10'; (或只是“状态”,或只是“说”)在第一行。 3.设置环境变量PERL5DB为“BEGIN { require 'myperl5db.pl' }”

    我在 PerlMonks 找到的。

    【讨论】:

    • 嗯,谢谢你的回答,它解释了为什么会发生。但是现在我更困惑了:在调试器中加载这些功能之前,我已经尝试过使用'use feature'say'',但这并没有奏效。现在我看到了诀窍:它应该在同一行。为什么???为什么“功能”模块会导出本地化到当前范围(数据库行)的函数? “使用”如何做到这一点?我认为它始终是全球性的。如果你想要一些本地化的东西,你使用'require'不是吗?对于这个问题,我将不胜感激。
    • 我也觉得这很不寻常。老实说,我不太确定“为什么”部分,但看起来你是绝对正确的——use feature x 语句的作用就像它们的范围是 DB 行。我的猜测是每一行都作为不同的块/作用域执行,因为声明my $x = 1 之类的变量也会使$x 在后续行中不可用(因为它不在下一行的范围内,只有当前线)。这将是一致的,因为 pragma(如 feature)在词法上被限定在您使用它们的块的末尾。
    • 谢谢,我错过了 feature 词法范围。这解释了“仅在行内行动”。但是您知道为什么如果我的模块或脚本以use feature 开头,它也不起作用吗?这是否意味着所有use feature ... 都会发生这种情况?最后,如果您在脚本中使用 perl >5.10 功能,当行有错误并且您想在调试器中使用它时如何调试它们?你会用 Devel::REPL 来玩它吗?
    • 嗯,所以如果您在调试器中运行具有use feature 杂注的脚本,它不会按预期工作?这可能是一个错误,或者您的环境可能设置得很奇怪。我用一个非常简单的两行程序进行了测试:use feature "say"; say "Hello";(在我无法在此评论中表示的单独行上)并且它按预期工作。调试器启动后,您是否按c(或n)?脚本的执行,默认需要手动启动。
    • 不,脚本在调试器中完美运行。问题是当我使用use feature ':5.10' 调试脚本时直接在调试器中编写代码时。正如您在调试器中添加 use feature 之前所解释的那样,它并没有帮助,因为它只能在同一行中工作,但不会在它之外持续存在,所以这是一个矫枉过正的解决方案。不幸的是,在有问题的行之前设置中断,并且复制粘贴修改try_it_interactively 不适用于调试器内的“5.10 功能”:-(
    猜你喜欢
    • 2011-01-29
    • 2022-01-10
    • 2021-10-30
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 2010-11-25
    • 2019-11-03
    • 1970-01-01
    相关资源
    最近更新 更多