是否有像Firebug这样的调试工具用于服务器端Perl / CGI?

时间:2012-08-05 16:06:11

标签: perl debugging testing cgi

我非常喜欢使用Firebug来调试我的JavaScript代码,HTML DOM和网络加载,即:客户端关于Web开发的所有内容。

服务器端的情况并不那么明亮。我正在使用的应用程序使用Perl和强制性标准模块,如CGIDBI。我知道standard troubleshooting techniques,但似乎没有跟踪的调试工具,例如数据库查询或函数调用,给我很好的输出。

输出必须特别不仅仅是在STDOUT(想象Content-Type: application/json)或STDERR(通过错误日志轻击非常不舒服)被拉动,并且该工具不应该要求我手动将填充物填充到核心模块或在整个代码中加注use Data::Dumper; print '<pre>',Dumper($foo),'</pre>'

长话短说:是否有一个工具可以让Perl / CGI的服务器端调试像Firebug在客户端一样有趣?

3 个答案:

答案 0 :(得分:7)

是的,但他们依赖Plack。 Plack是一个位于Web框架和Web服务器之间的层。 Plack平滑了服务器差异并为plug in all sorts of debugging tools提供了一个位置。其中包括数据库profiletrace信息,您可以write your own debugging panels。还有一个interactive debugger,虽然我自己没有使用它。

如今许多Perl Web框架(例如Catalyst和Dancer)使用Plack,但是如果你使用直接的Perl和CGI,你就不会得到它。幸运的是,在Plack上运行CGI应用程序非常容易。 replace CGI with a subclass that uses Plackwrap your CGI code in an emulation layer

转换到Plack除了调试工具之外还有很多优点,值得付出努力。

答案 1 :(得分:6)

不,不是真的。

你可以做的事情是:

使用调试代码填充代码。

use constant DEBUG => 1;
...;
debug_function($var) if DEBUG;

一旦取消设置部署的DEBUG常量,就不会有任何额外的运行时成本(语句被优化掉),并且您可以在需要时重新激活它们。

你甚至可以说邪恶的事情,比如

BEGIN {require Data::Dumper if DEBUG}

有条件地加载调试模块。

如果要覆盖Core函数,为什么不添加调试处理程序?那不是邪恶的补丁,那就是增强......

BEGIN {
   if (DEBUG) {
      my $oldfunction = \&CORE::function;
      *CORE::function = sub {  # add prototypes if you like them
         debug_handler(@_);
         &$oldfunction;
      };
   }
}

使用此技术记录您对数据库的调用。

您可以将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";
   }
}

您可以定义DIEWARN处理程序,以执行您想要的某些操作:

$SIG{__WARN__} = sub {
    print MYERRORS "There was a warning: $!";
    # do additional error handling unless you're paranoid
}

warnings编译指示可以帮助您制作致命的重要警告:

use warnings qw(FATAL importantWarning);

或创建自己的警告,请参阅文档

要获得调用堆栈跟踪,请查看caller函数的众多可能性。从本质上讲,您可能希望建立对Carp模块的个人解释,因为CGI::Carp可能无法满足您的需求。

答案 2 :(得分:1)

除了上述内容之外,请检查Devel::LTrace,它可以告诉您何时调用已命名的子例程,以及Devel::CallTrace,它可以告诉您在何时何地调用哪些子例程。