有哪些好的Perl调试方法?
除了有哪些好的Perl调试方法?,perl,debugging,programming-languages,cpan,Perl,Debugging,Programming Languages,Cpan,除了Data::Dumper和Perl-d,还有其他调试Perl程序的方法吗? Perl中有几种工具可用于调试和类似任务 内置命令行调试器 perl -d yourcode.pl Andrew E.Page的基于Perl/Tk的图形调试器 这是一个在Linux和Windows上运行的免费工具。源代码不是 可用 Perl Regex调试器和Mark Jason Dominus撰写的一篇关于它的文章 有些人使用打印语句来查看程序中没有执行他们认为代码会执行的操作的部分发生了什么。(
Data::Dumper
和Perl-d
,还有其他调试Perl程序的方法吗?
Perl中有几种工具可用于调试和类似任务
内置命令行调试器
perl -d yourcode.pl
Andrew E.Page的基于Perl/Tk的图形调试器
这是一个在Linux和Windows上运行的免费工具。源代码不是 可用
Perl Regex调试器和Mark Jason Dominus撰写的一篇关于它的文章
有些人使用
打印语句来查看程序中没有执行他们认为代码会执行的操作的部分发生了什么。(也就是说,作为一种在给定执行点检查变量中实际包含的内容的方法。)我认为编写测试主要可以减少调试时间。我常用的工具范围是:
- 打印语句和数据::用于简单情况的转储程序
- perl-d
这通常就足够了。有;我听说它很不错,但从没玩过
对于某些任务(不是真正的调试,但接近调试),我使用。我喜欢。基本上,它会给您一个执行转储,向您显示代码路径
另一方面,它现在风靡一时,因此您也可能对用于高级测试的分析工具感兴趣。有关有趣的概述,请参见此。我使用它进行逐步调试
perl -MDevel::SimpleTrace -we'warn "main"; sub foo{ warn "outer"; sub { warn "inner" } }; foo()->()'
有一个分步调试程序用于其
就个人而言,我更喜欢ActiveState版本。它看起来更坚固、更稳定,但它确实需要花费(而且工作也为我付出了代价)。如果这是我的钱,那么我会使用Eclipse和EPIC,因为它们是免费的。Test::More用于编写基本测试,Hook::LexWrap、Test::MockObject、Test::Deep、Test::MockTime、Test::WWW::Mechanize和许多其他用于高级测试
属性::用于检查子参数的签名。Carp::断言用于基于契约的编程
可以使用Devel::Ebug::Wx或Devel::ptkdb(很快在中得到更好的支持)来简化调试。有很多东西可以帮助您:
perl -MDevel::SimpleTrace -we'warn "main"; sub foo{ warn "outer"; sub { warn "inner" } }; foo()->()'
- -打印执行的每一行
- -当代码抛出警告时,进入REPL
*
- -可以从Perl代码控制的调试器
- -在运行时使用调试器,无论您的进程是否是通过调试启动的
根据您所做的工作,提供了一种管理“打印”式调试的简便方法,尤其是在大型应用程序中:
- 提供各种日志级别(调试、信息、错误、警告和致命日志)
- 从配置文件控制(例如,易于在开发框上调试,仅在生产框上调试错误)
- 可根据应用程序的各个部分进行配置(例如,一个日志文件中的web应用程序处于一个级别,另一个日志文件中的脚本处于不同的日志级别)
- 可按类配置-易于消除嘈杂的模块,或在应用程序的深处添加详细的调试
最好的调试工具是小程序、短范围、有限的副作用和大量测试。在虫子孵化之前阻止它们。
CGI::Dump
基准
命令行选项
__数据和
$.
__文件&&&&&&&&&&
警告()
使用Devel::SimpleTrace进行最优雅的无缝无状态调试
perl -MDevel::SimpleTrace -we'warn "main"; sub foo{ warn "outer"; sub { warn "inner" } }; foo()->()'
通常我用
perl -d
用于调试
perl -MDevel::SimpleTrace -we'warn "main"; sub foo{ warn "outer"; sub { warn "inner" } }; foo()->()'
您还可以为Eclipse使用Eclipse Perl集成(EPIC)插件。它提供了一个丰富的调试环境,并与EPIC Perl开发环境集成。您可以使用它,它通常很有用。在开发过程中,我喜欢将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;'
如果你不喜欢perl-d,那么和都是不错的选择。就个人而言,我是perl-d的忠实粉丝。它使得追踪死亡变得简单,而且也不需要再把它去掉
use Smart::Comments -ENV;
...
sub myroutine {
my ($self, @args) = @_ ;
### args: @args
...
}
如果在环境中设置了Smart_Comments
,则以####开头的行将转换为调试输出,并自动使用Dumper()
。如果未设置环境变量,则调试内容完全无效
它有大量的特性,将产生进度条、警告、中止条件以及普通的旧调试输出
适当的测试都是好的,我并不排斥一种好的(TDD)开发方法,但当试图找出现有缺陷的根源时,Smart::Comments是最好的选择。Emacs,放手:
emacs my_script.pl
M-x perldb
Emacs将提示您:
运行perldb(如下所示):perl my_script.pl
按enter键(或添加命令行开关)
现在像往常一样使用调试器
键入“c”继续执行代码,在执行代码时,代码将跟随代码
Emacs与其调试器完全集成,使调试Perl代码变得非常简单。提供了插入和启用/禁用打印语句以进行调试的简单方法
perl -MDevel::SimpleTrace -we'warn "main"; sub foo{ warn "outer"; sub { warn "inner" } }; foo()->()'
函数的作用是:打印变量名、值和子程序名。该实现已经过优化,以尽量减少程序员的击键次数
以下是开始使用的示例代码:
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';
输出:
调试子mysub:你好,世界!
调试子mysub:$myvar='some value'
调试子mysub:@list=[
“零”,
1.
“两个”,
'3'
]
调试子mysub:%hash={
“一”=>2,
“三”=>4
}
有许多选项可用于自定义输出。完整的文档可以在上找到。+WishPerl-是一个很好的工具