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

Ste*_*sky 2 testing debugging perl cgi

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

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

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

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

Sch*_*ern 7

是的,但他们依赖普拉克.Plack是一个位于Web框架和Web服务器之间的层.Plack平滑了服务器差异,并提供了插入各种调试工具的地方.这些包括数据库配置文件跟踪信息,您可以编写自己的调试面板.还有一个交互式调试器,虽然我自己没有使用它.

如今许多Perl Web框架(例如Catalyst和Dancer)使用Plack,但如果你使用直接Perl和CGI,你就不会得到它.幸运的是,在Plack上运行CGI应用程序非常容易.无论是与使用普拉克一个子类代替CGI,或在一个仿真层包裹你的CGI代码.

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


amo*_*mon 6

不,不是真的.

你可以做的事情是:

使用调试代码填充代码.

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)

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

$SIG{__WARN__} = sub {
    print MYERRORS "There was a warning: $!";
    # do additional error handling unless you're paranoid
}
Run Code Online (Sandbox Code Playgroud)

warningspragma可以帮助您做出致命的重要警告:

use warnings qw(FATAL importantWarning);
Run Code Online (Sandbox Code Playgroud)

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

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