除了Data::Dumper
和perl -d
之外,还有其他调试Perl的方法吗?
答案 0 :(得分:16)
Perl中有几种工具可用于调试和类似任务。
内置命令行调试器。
perl -d yourcode.pl
Andrew E. Page。基于Perl / Tk的图形化调试器。
这是一个在Lisp编写的Linux和Windows上运行的免费工具。源代码不是 可用。
Perl Regex调试器和Mark Jason Dominus撰写的一篇关于它的文章。
答案 1 :(得分:13)
有很多东西可以帮助你:
*
答案 2 :(得分:9)
我喜欢Devel::Trace。基本上它会为您提供执行转储,显示代码路径。
另一方面,测试驱动开发现在风靡一时,因此您也可以对像Devel::NYTProf这样的工具进行分析,以进行高级测试。请参阅此Tim bunce's blog post以获取有趣的概述。
答案 3 :(得分:8)
我使用ActiveState Komodo进行逐步调试。
Eclipse为其EPIC plugin提供了一步一步的调试程序。
我个人更喜欢ActiveState版本。它看起来更加稳固和稳定,但确实需要花费(而且工作对我来说很重要)。如果这是我的钱,那么我会使用Eclipse和EPIC,因为它们是免费的。
答案 4 :(得分:7)
最好的调试辅助工具是小程序,短范围,有限的副作用和大量测试。在它们孵化之前阻止它们。
答案 5 :(得分:5)
我常用的工具范围是:
这通常就足够了。有ddd;我听说这很好,但从未玩过它。
对于某些任务(实际上没有调试,但接近它),我使用Devel::NYTProf。
答案 6 :(得分:4)
有些人使用print
语句来查看程序中未执行他们认为代码会执行的操作的部分。 (即,作为在给定执行点检查变量中实际包含的内容的一种方式。)
那就是说,问题很模糊。有没有你想要做的事情,Data :: Dumper和perl -d
没有帮助?
答案 7 :(得分:4)
根据您正在做的事情,Log::Log4perl提供了一种简单的方法来管理“打印”调试风格,尤其是在更大的应用程序中:
答案 8 :(得分:3)
测试::更多用于编写基本测试,Hook :: LexWrap,Test :: MockObject,Test :: Deep,Test :: MockTime,Test :: WWW :: Mechanize以及许多其他高级测试。 Attribute ::签名用于检查子参数。 Carp :: Assert for contract-based programming。
Devel :: Ebug :: Wx或Devel :: ptkdb(很快在Padre中得到更好的支持)可用于更容易的调试。
答案 9 :(得分:3)
Emacs,放下手。
emacs my_script.pl
M-x perldb
Emacs will prompt you :
Run perldb (like this): perl my_script.pl
Hit enter (or add command line switches)
Now use the debugger as usual.
Type 'c' to continue executing the code, which will now follow
your code as you execute through it.
Emacs is fully integrated with its debuggers and will make debugging perl code nearly trivial.
答案 10 :(得分:2)
使用Devel :: SimpleTrace进行最优雅的无状态调试。
perl -MDevel :: SimpleTrace -we'warn“main”; sub foo {警告“外”; sub {warn“inner”}}; FOO() - >()'
答案 11 :(得分:2)
如果您不喜欢perl -d
,那么Devel::REPL和Carp::REPL都是不错的选择。
答案 12 :(得分:2)
就个人而言,我是Smart::Comments的忠实粉丝。使追踪变得简单,无需再将其剥离。
use Smart::Comments -ENV;
...
sub myroutine {
my ($self, @args) = @_ ;
### args: @args
...
}
如果在环境中设置了Smart_Comments
,则以###开头的行将转换为调试输出,并自动使用Dumper()
。如果未设置环境变量,则调试内容完全是惰性的。
它有很多功能,并且会产生进度条,警告,中止条件以及普通的旧调试输出。
适当的测试都很好,我并没有放弃一个好的TDD开发方法,但是当试图找到现有bug的底部时,Smart :: Comments就是这样。
答案 13 :(得分:1)
一般我用
perl -d
用于调试。
你也可以使用Eclipse的Eclipse Perl Integration(EPIC)插件它提供了丰富的调试环境,并与EPIC Perl开发环境集成。你可以使用它,通常很有帮助。
答案 14 :(得分:1)
在开发过程中,我喜欢在战略位置(不是太多)中嵌入printf语句,这些语句使用这样的调试标志启用:
printf("h='$h', j='$j', ... (%d)\n", __LINE__) if $debug;
其中调试标志位于脚本顶部:
my $debug = $ENV{DEBUG} || 0;
现在我不必记住注释掉所有printf行,而是按照以下方式运行脚本:
DEBUG=1 ./script.pl
在测试完所有内容后,可以删除调试行:
cat script.pl | grep -v 'if $debug;'
答案 15 :(得分:0)
我认为编写测试大多可以减少调试时间。
答案 16 :(得分:0)
CGI::Dump
Benchmark
Command-line options
__DATA__ & <DATA>
$.
__FILE__ & __LINE__
warn() & die()
答案 17 :(得分:0)
Debug::Statements提供了一种简单的方法来插入和启用/禁用print语句以进行调试。
d()函数输出变量名称,值和子程序名称。该实现已经过优化,可以最大限度地减少程序员击键。
以下是帮助您入门的示例代码:
my $myvar = 'some value';
my @list = ('zero', 1, 'two', "3");
my %hash = ('one' => 2, 'three' => 4);
use Debug::Statements;
my $d = 1;
d "Hello world";
d '$myvar';
d '@list %hash';
输出:
DEBUG sub mysub: Hello world
DEBUG sub mysub: $myvar = 'some value'
DEBUG sub mysub: @list = [
'zero',
1,
'two',
'3'
]
DEBUG sub mysub: %hash = {
'one' => 2,
'three' => 4
}
有许多选项可用于自定义输出。可以在CPAN上找到完整的文档。