2

我真的很喜欢使用 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 在客户端的调试一样有趣?

4

3 回答 3

7

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

现在很多 Perl Web 框架(例如 Catalyst 和 Dancer)都使用 Plack,但是如果你直接使用 Perl 和 CGI​​,你就不会得到它。幸运的是,让 CGI 应用程序在 Plack 上运行非常容易。要么用使用 Plack 的子类替换 CGI,要么将 CGI 代码包装在仿真层中。

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

于 2012-08-06T01:57:19.117 回答
6

不,不是。

你可以做的事情是:

在你的代码中添加调试代码。

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

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

你甚至可以说一些邪恶的话,比如

BEGIN {require Data::Dumper if DEBUG}

有条件地加载调试模块。

如果你想覆盖核心函数,为什么不添加调试处理程序呢?那不是邪恶的修补,那是增强……</p>

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
}

warningspragma 可以帮助您使重要的警告变得致命:

use warnings qw(FATAL importantWarning);

或创建自己的警告,只需查看文档

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

于 2012-08-05T16:35:46.520 回答
1

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

于 2012-11-12T14:26:47.193 回答