【问题标题】:Workflow to debug for a Perl programmer为 Perl 程序员调试的工作流程
【发布时间】:2013-05-26 21:07:20
【问题描述】:

我是Perl 的新手,遇到以下问题。
我有一个日志输出,我找到了这个日志输出的来源。我的意思是打印它的某个模块中的子程序。

现在例如在Java 通过Eclipse 我会使用例如Call hierarchy 和其他实用程序来查看如何/何时/谁调用该方法并弄清楚如何重现我需要的内容并进行调试。

如何在Perl 中执行此操作?通过例如grep?如果我grep 例如对于模块名称,我得到数百行,范围从 use A require A C::B::A B::A C::B::A::some_routine C::B::A::some_other_routine 等。
最重要的是,我担心也许我感兴趣的例程不是直接调用的,而是一些脚本,例如通过一些晦涩难懂的方式运行我感兴趣的模块(由于我对Perl 的无知)。

那么我将如何以最有效的方式调试Perl 中的某些内容? Perl 大师们建议我做什么并提高效率?

【问题讨论】:

  • 如果您有 EPIC IDE for Eclipse,那么您可以按照通常的方式在子例程中设置断点。程序暂停后,您可以从那里看到调用堆栈。

标签: perl debugging


【解决方案1】:

在 Perl 调试器下运行程序:

perl -d scriptname arguments...

在您关心的函数中设置断点,当程序在断点处停止时,使用T调试器命令显示堆栈跟踪,这将显示该函数的调用位置。

从您的 cmets 来看,我不确定这是否真的解决了您正在寻找的问题。也许您想要的是 Perl 应用程序的交叉引用?请参阅常见问题解答How do I cross-reference my Perl programs?

【讨论】:

  • +1。我不知道程序从哪里开始。我的意思是没有像JavaC++ 这样的main。从我(无知)的角度来看,我有很多可以调用模块的脚本,但我真的不知道流程是什么。我所说的有意义吗?
  • Perl 程序是脚本,因此它们从不在任何函数定义中的顶级代码开始。
  • perl -d 是否需要图形环境?
  • 所以你建议在调试器下将脚本作为程序运行?好的。但是我怎样才能知道还有哪些其他模块调用了这个模块的例程呢?
  • 您必须知道在应用程序中运行的主脚本。您使用 -d 选项运行该脚本,在您关心的模块中设置断点。然后等待断点被命中,进行堆栈跟踪,您将在调用它的其他模块中看到该函数。
【解决方案2】:

大多数情况下,获取堆栈跟踪(以及一些调试信息)是一个好的开始。可以使用标准的Carp 模块来生成堆栈跟踪:

use Carp;  
print_to_log(Carp::longmess("We're here"));

或者也有一个object-oriented module

【讨论】:

  • 所以你的意思是修改脚本添加Carp?
  • 不是脚本,而是包含感兴趣函数的模块。
【解决方案3】:

要在不修改任何代码的情况下获取调用堆栈的转储,您可以使用 perl 命令行在 Carp::Always 下运行您的程序:

perl -MCarp::Always my_program.pl

【讨论】:

  • 我收到Can't locate Carp/Always.pm in @INC
  • @Cratylus 然后您可能需要从 CPAN 安装模块,请参阅 man cpan(我猜它是 Perl 附带的)或 cpanminus。另见this discussion
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多