我是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
大师建议我做什么并提高效率?
答案 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"));
答案 2 :(得分:4)
要在不修改任何代码的情况下获取调用堆栈的转储,可以使用perl命令行在Carp::Always下运行程序:
perl -MCarp::Always my_program.pl