有什么好的Perl调试方法?

时间:2009-06-24 10:38:19

标签: perl debugging programming-languages cpan

除了Data::Dumperperl -d之外,还有其他调试Perl的方法吗?

18 个答案:

答案 0 :(得分:16)

Available tools for debugging

Perl中有几种工具可用于调试和类似任务。


内置命令行调试器。

perl -d yourcode.pl

Devel::ptkdb

Andrew E. Page。基于Perl / Tk的图形化调试器。


Regex Coach

这是一个在Lisp编写的Linux和Windows上运行的免费工具。源代码不是 可用。


Rx: A Regex Debugger for Perl

Perl Regex调试器和Mark Jason Dominus撰写的一篇关于它的文章。


A GUI for the Perl Debugger

答案 1 :(得分:13)

有很多东西可以帮助你:

  • Devel::Trace - 打印执行
  • 的每一行
  • Carp::REPL - 当代码抛出警告时,将其放入REPL *
  • Devel::ebug - 您可以使用Perl代码控制的调试器
  • Enbugger - 在运行时使用调试器,无论您的进程是否已通过调试启动

答案 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)

我常用的工具范围是:

  • 打印语句和Data :: Dumper for simple cases
  • perl -d

这通常就足够了。有ddd;我听说这很好,但从未玩过它。

对于某些任务(实际上没有调试,但接近它),我使用Devel::NYTProf

答案 6 :(得分:4)

有些人使用print语句来查看程序中未执行他们认为代码会执行的操作的部分。 (即,作为在给定执行点检查变量中实际包含的内容的一种方式。)

那就是说,问题很模糊。有没有你想要做的事情,Data :: Dumper和perl -d没有帮助?

答案 7 :(得分:4)

根据您正在做的事情,Log::Log4perl提供了一种简单的方法来管理“打印”调试风格,尤其是在更大的应用程序中:

  • 提供各种日志记录级别(调试,信息,错误,警告,致命)
  • 从配置文件控制(易于在开发箱上进行调试,仅在生产箱上进行调试)
  • 可以根据应用程序的各个部分进行配置(例如,一个日志文件中的Web应用程序,一个级别的日志文件,另一个日志级别的cron脚本)
  • 可由Class配置 - 易于安静的模块,或在应用程序深处的某个地方添加详细的调试

答案 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::REPLCarp::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)

Some Other methods

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上找到完整的文档。