【问题标题】:How to set breakpoint on a particular file in Perl program?如何在 Perl 程序中的特定文件上设置断点?
【发布时间】:2012-01-19 02:53:56
【问题描述】:

我的 Perl 程序如下所示:

foo/
foo/bar/
for/bar/test.pm
foo.pm
foo/bar.pm
test.pl

并使用perl test.pl 启动程序。 我想在 foo/bar/test.pm 中调试一个 sub。如何在该子上设置断点?

我该怎么做?

谢谢。

【问题讨论】:

  • 我对提供的答案不满意。在特定文件的特定行处中断所需的b [ln] 语法是什么?
  • 调试器窗口中的 "f 文件名" 将显示完整路径。然后复制该路径并写入“b full_path/test.pm:line_number”

标签: perl


【解决方案1】:

要调试 perl 脚本,请使用 -d 开关来调用调试器。

perl -d test.pl

在调试器中,您可以使用b <line no> 在当前文件中设置断点。有时候在一个还没有加载或者很久以前加载的文件中设置断点比较麻烦,所以也可以放行

$DB::single = 1;

在任何 perl 程序中的任何地方,调试器将在执行该行后立即中断。这也是在编译时运行的代码中设置断点的好方法(唯一的方法?)。

【讨论】:

  • 值得注意的是,调试器中的'f'命令将切换到查看文件名,如'f /Path/To/Module.pm';该文件必须已加载。然后,您可以设置断点,不仅在子例程的入口点,而且在该文件中的任何有效行。
  • '$DB::single = 1;'为任何人工作的线路?我猜这不是停止控制
  • 我们可以使用 ;停止控件的行(但看不到变量的任何值)。打印数据::Dumper::Dumper($variable);行有助于打印值
  • 自 1995 年以来我一直在使用 perl,但从未遇到过 $DB::single = 1; 我非常感谢您的提示!
【解决方案2】:

只需使用 sub 的完全限定名称作为 b 的参数:

b foo::bar::test::subname

例子:

$ perl -d -e'use CGI; CGI->new'
...
main::(-e:1):   use CGI; CGI->new
  DB<1> b CGI::new
  DB<2> r
CGI::new(.../CGI.pm:337):
337:      my($class,@initializer) = @_;
  DB<2> q

【讨论】:

  • 这是对 OP 问题的实际答案。 (我已经知道这一点,实际上正在寻找其他答案中给出的信息。)
  • 我如何在包裹的特定行中断?
  • @snoopyjc 把$DB::single = 1;放在那一行
  • @ikegami 谢谢,但我的意思是不更改源代码。
猜你喜欢
  • 1970-01-01
  • 2019-08-04
  • 2020-02-02
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 2012-11-28
相关资源
最近更新 更多