调试Perl程序员的工作流程

时间:2013-05-25 19:01:18

标签: perl debugging

我是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大师建议我做什么并提高效率?

3 个答案:

答案 0 :(得分:5)

在Perl调试器下运行程序:

perl -d scriptname arguments...

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

根据您的评论,我不确定这实际上是否符合您的要求。也许你想要的是Perl应用程序的交叉引用?请参阅常见问题解答How do I cross-reference my Perl programs?

答案 1 :(得分:4)

大多数时候获得堆栈跟踪(以及一些调试信息)是一个良好的开端。可以使用标准Carp模块生成堆栈跟踪:

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

或者也有object-oriented module

答案 2 :(得分:4)

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

perl -MCarp::Always my_program.pl