【问题标题】:Can I insert break point into source perl program?我可以在源 perl 程序中插入断点吗?
【发布时间】:2011-01-14 13:20:00
【问题描述】:

我希望 perl 程序在遇到某些条件时启动调试器。其他一些语言有库支持的debug()语句,perl中是否有类似的语句?

【问题讨论】:

    标签: perl debugging


    【解决方案1】:

    如果我理解正确,您需要在代码中使用特定的调试器变量 - $DB::single。在您的代码中将此设置为真值将导致调试器在该行停止。

    $x = 1234;
    $DB::single = 1;
    enter_problematic_sub_now();
    

    然后您的代码将停在 $DB::single 设置为 1 的行。

    当然,如果您实际上不能确保您的代码在调试器中运行,那么您完全有另一个问题。您还需要通过perl -d 运行您的代码。

    【讨论】:

    • 你的意思是如果我的程序没有在调试器中运行,我就不能按预期使用 $DB::single 吗?
    • @Thompson:是的,没错。如果要调试 Perl 程序,则必须在调试器下运行它。据我所知,这种情况适用于大多数其他语言中基于源代码的实时调试——尽管有核心转储的事后分析。
    • @tchrist 我不确定它在 Python 内部是如何工作的,但我可以在代码中的任何位置执行 import pdb; pdb.set_trace() 以在此时中断并进入调试器。我不必使用任何特殊的调试修饰符来运行脚本。
    【解决方案2】:

    您是否尝试将 -d 开关添加到脚本顶部的 shebang 行?类似的东西

    #!/usr/bin/perl -d
    use strict;
    use warnings;
    $|=1;$\="\n";
    
    print "Test";
    

    这真的取决于它是如何启动的,但至少在简单的情况下这应该启动调试器。

    编辑: 然后,您可以使用

    在具有特定条件的特定行上设置断点
    > b [line] [condition]
    

    然后点击

    > c
    

    继续运行脚本 - 满足条件时调试器将在指定行停止

    【讨论】:

    • 太好了。 windows上有类似的语法吗?
    • 我相信 perl 会尊重开关,即使实际的 perl 可执行文件启动不是 shebang 中列出的那个 - 即,即使上面的脚本启动为 C:\Perl\bin \perl.exe script.pl,它仍然应该启动调试器
    【解决方案3】:

    嗯,有一些东西可以让您执行断点之类的操作,但功能更广泛:Perl Debugger

    【讨论】:

    • 当我无法更改启动方法(命令行为 perl 可执行文件)时,这可以工作吗?
    • 启动方法是必不可少的,没有选项-d不能使用调试器
    【解决方案4】:

    本质上,-d 开关允许您与 perl 可执行文件通信,并允许 perl 可执行文件与您通信。

    More

    【讨论】:

    • 我的一段 perl 代码是大型系统的一部分,我无法控制它是如何启动的。看来我只能修改源文件才能这样做。
    • @Thomson Tan:在这种情况下,日志记录会更好。看看Log::Log4perl
    猜你喜欢
    • 1970-01-01
    • 2019-12-24
    • 2014-11-14
    • 2010-12-03
    • 2011-11-03
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    相关资源
    最近更新 更多