【问题标题】:Is there a debugging tool like Firebug for server-side Perl/CGI?是否有用于服务器端 Perl/CGI 的调试工具,例如 Firebug?
【发布时间】:2012-08-02 19:29:24
【问题描述】:

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

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

输出不能仅仅在 STDOUT(想象一下Content-Type: application/json)或 STDERR(通过错误日志查找非常不舒服),并且该工具不应该要求我手动将东西修补到核心模块中或撒@ 987654325@通关代码。

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

【问题讨论】:

    标签: perl debugging testing cgi


    【解决方案1】:

    是的,但它们依赖于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​​,您将无法使用它。幸运的是,让 CGI 应用程序在 Plack 上运行非常容易。 replace CGI with a subclass that uses Plackwrap your CGI code in an emulation layer

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

    【讨论】:

    • +1,因为 PSGI/Plack 是现代方式。我真的很喜欢Enbugger,它允许在运行时加载调试器。
    • Plack::Middleware::Debug 看起来不错,但仍然存在一个问题,即它仅适用于 Content-Type: text/html,因为它操纵“STDOUT”。
    • @StefanMajewsky 是的,您必须临时更改内容类型。否则它必须是一个浏览器插件,而且我不知道有什么可以调试服务器端代码。
    【解决方案2】:

    不,不是。

    你可以做的事情是:

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

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

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

    你甚至可以说坏话,比如

    BEGIN {require Data::Dumper if DEBUG}
    

    有条件地加载调试模块。

    如果您想覆盖核心功能,为什么不添加调试处理程序?那不是邪恶的修补,那是增强……

    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 pragma 可以帮助您使重要的警告变得致命:

    use warnings qw(FATAL importantWarning);
    

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

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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 2011-05-20
      相关资源
      最近更新 更多