Ste*_*sky 2 testing debugging perl cgi
我非常喜欢使用Firebug来调试我的JavaScript代码,HTML DOM和网络加载,即:客户端关于Web开发的所有内容.
服务器端的情况并不那么明亮.我正在使用的应用程序使用Perl和强制性标准模块,如CGI和DBI.我知道标准的故障排除技术,但似乎没有跟踪例如数据库查询或函数调用的调试工具,并给我很好的输出.
输出必须特别不仅仅是在STDOUT(想象Content-Type: application/json
)或STDERR(通过错误日志进行捣乱非常不舒服)被拉动,并且该工具不应该要求我手动将填充物填充到核心模块中或者use Data::Dumper; print '<pre>',Dumper($foo),'</pre>'
在整个代码中喷洒.
长话短说:是否有一个工具可以让Perl/CGI的服务器端调试像Firebug在客户端那样有趣?
是的,但他们依赖普拉克.Plack是一个位于Web框架和Web服务器之间的层.Plack平滑了服务器差异,并提供了插入各种调试工具的地方.这些包括数据库配置文件和跟踪信息,您可以编写自己的调试面板.还有一个交互式调试器,虽然我自己没有使用它.
如今许多Perl Web框架(例如Catalyst和Dancer)使用Plack,但如果你使用直接Perl和CGI,你就不会得到它.幸运的是,在Plack上运行CGI应用程序非常容易.无论是与使用普拉克一个子类代替CGI,或在一个仿真层包裹你的CGI代码.
转换到Plack除了调试工具之外还有很多优点,值得付出努力.
不,不是真的.
你可以做的事情是:
使用调试代码填充代码.
use constant DEBUG => 1;
...;
debug_function($var) if DEBUG;
Run Code Online (Sandbox Code Playgroud)
一旦取消设置DEBUG
部署常量,就不会有任何额外的运行时成本(语句被优化掉),并且您可以在需要时重新激活它们.
你甚至可以说邪恶的事情
BEGIN {require Data::Dumper if DEBUG}
Run Code Online (Sandbox Code Playgroud)
有条件地加载调试模块.
如果要覆盖Core函数,为什么不添加调试处理程序?这不是邪恶的修补,那就是增强......
BEGIN {
if (DEBUG) {
my $oldfunction = \&CORE::function;
*CORE::function = sub { # add prototypes if you like them
debug_handler(@_);
&$oldfunction;
};
}
}
Run Code Online (Sandbox Code Playgroud)
使用此技术记录对数据库的调用.
您可以重新打开STDERR
某些特殊文件(或管道,终端或......)
BEGIN {
if (DEBUG) {
close STDERR or die "STDERR hates me and doesn't want to be closed.";
open STDERR, '>', "/path/to/my/error/log.file" or die "couldn't open error log";
}
}
Run Code Online (Sandbox Code Playgroud)
您可以定义您的DIE
和WARN
处理程序以执行您想要的操作:
$SIG{__WARN__} = sub {
print MYERRORS "There was a warning: $!";
# do additional error handling unless you're paranoid
}
Run Code Online (Sandbox Code Playgroud)
该warnings
pragma可以帮助您做出致命的重要警告:
use warnings qw(FATAL importantWarning);
Run Code Online (Sandbox Code Playgroud)
或者要创建自己的警告,请参阅文档
要获得调用堆栈跟踪,请查看caller
函数的众多可能性.从本质上讲,您可能希望建立对Carp
模块的个人解释,因为CGI::Carp
可能无法满足您的需求.