是否有针对服务器端Perl/CGI的Firebug之类的调试工具?
我非常喜欢使用Firebug调试我的JavaScript代码、HTMLDOM和网络加载,也就是说:关于web开发的所有客户端内容 服务器端的情况并不乐观。我正在开发的应用程序使用Perl和强制性标准模块,如和。我知道,但似乎没有任何调试工具可以跟踪数据库查询或函数调用,并提供良好的输出 特别是输出不能只在STDOUT(想象一下是否有针对服务器端Perl/CGI的Firebug之类的调试工具?,perl,debugging,testing,cgi,Perl,Debugging,Testing,Cgi,我非常喜欢使用Firebug调试我的JavaScript代码、HTMLDOM和网络加载,也就是说:关于web开发的所有客户端内容 服务器端的情况并不乐观。我正在开发的应用程序使用Perl和强制性标准模块,如和。我知道,但似乎没有任何调试工具可以跟踪数据库查询或函数调用,并提供良好的输出 特别是输出不能只在STDOUT(想象一下内容类型:application/json)或STDERR(浏览错误日志非常不舒服)上被猛拉,而且该工具不应该要求我手动将补丁程序放入核心模块中,或者将使用Data::Du
内容类型:application/json
)或STDERR(浏览错误日志非常不舒服)上被猛拉,而且该工具不应该要求我手动将补丁程序放入核心模块中,或者将使用Data::Dumper;打印“”、转储程序($foo)、“”
并将代码全部打印出来
use constant DEBUG => 1;
...;
debug_function($var) if DEBUG;
长话短说:有没有一种工具可以让调试Perl/CGI的服务器端变得像在客户端调试Firebug一样有趣?没有,没有
你可以做的事情是:
在代码中加入调试代码
BEGIN {require Data::Dumper if DEBUG}
一旦您为部署取消设置DEBUG
常量,您将不会有任何额外的运行时开销(语句将被优化掉),并且您可以在必要时重新激活它们
你甚至可以说像这样的坏话
BEGIN {
if (DEBUG) {
my $oldfunction = \&CORE::function;
*CORE::function = sub { # add prototypes if you like them
debug_handler(@_);
&$oldfunction;
};
}
}
有条件地加载调试模块
如果要覆盖核心函数,为什么不添加调试处理程序?这不是邪恶的修补,而是增强
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";
}
}
使用此技术记录对数据库的调用
您可以重新打开某个特殊文件(或管道、终端或…)
您可以定义DIE
和WARN
处理程序来执行您想要的操作:
warnings
pragma可以帮助您将重要警告设置为致命警告:
或者,要创建自己的警告,请参阅文档
要获得调用堆栈跟踪,请研究
调用者
函数的多种可能性。基本上,您可能希望构建对Carp
模块的个人解释,因为CGI::Carp
可能无法满足您的需要。是的,但它们依赖于您的需求。Plack是一个位于web框架和web服务器之间的层。Plack消除了服务器之间的差异,为用户提供了一个交流的场所。这些包括数据库和信息,您可以。还有一个,虽然我自己没有用过
现在很多PerlWeb框架(例如Catalyst和Dancer)都使用Plack,但是如果您使用的是纯Perl和CGI,您将无法获得它。幸运的是,在Plack上运行CGI应用程序非常容易。要么,要么
转换为Plack除了调试工具之外还有很多优点,值得付出努力。除上述功能外,检查,它可以告诉您何时调用命名的子例程,并且可以告诉您何时何地调用了哪些子例程。更正:
print
。请参阅@stefanmayewsky谢谢你的提示,我将我的示例设置为通用的+1,因为PSGI/Plack是现代的方式。我非常喜欢它允许在运行时加载调试器。Plack::Middleware::Debug看起来不错,但仍然存在一个问题,即它只适用于内容类型:text/html
,因为它操纵“STDOUT”。@stefanmayewsky是的,您必须临时更改内容类型。否则,它将不得不是一个浏览器插件,我不知道有任何调试服务器端代码。
$SIG{__WARN__} = sub {
print MYERRORS "There was a warning: $!";
# do additional error handling unless you're paranoid
}
use warnings qw(FATAL importantWarning);