【问题标题】:How do I use the debugger with mod_perl如何将调试器与 mod_perl 一起使用
【发布时间】:2011-04-07 18:20:24
【问题描述】:

我正在尝试将 Perl 调试器附加到 Apache 和 mod_perl。我们的 环境非常复杂(很多额外的东西(例如催化剂) 用 Apache 配置)和配置它的工程师没有 与公司相处的时间更长。我已按照 Apache 上的说明进行操作 网站,设置“PerlFixupHandler Apache::DB”等。 但到目前为止,我得到的只是调试器 after 该页面已交付。我猜我得到了突破 调度进程,而不是工作进程。我正在运行 prefork MPM 阿帕奇的版本。调试说明说在传递 -X 参数时 启动 httpd。但是我正在运行的 httpd 不接受 -X 参数。 我假设 -X 参数实际上会导致某些版本的 httpd 不分叉?

感谢所有指导。

$ ./httpd -v
Server version: Apache/2.2.17 (Unix)
Server built:   Nov 16 2010 20:13:24

-X isn't listed when I do httpd -?    
Usage: ./httpd [-D name] [-d directory] [-f file]
           [-C "directive"] [-c "directive"]
           [-k start|restart|graceful|graceful-stop|stop]
           [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S]

【问题讨论】:

  • 你有没有试过在启动apache之前设置断点? (即$DB::single=1)或者,尝试转储 \%DB:: 符号表以查看是否在生成响应的进程部分中加载了调试器?
  • 根据您的需要,您还可以在代码中添加print eval, "\n" while <>; 行,这将使您在每次运行时都进入一个基本的repl。键入您需要的命令,然后按 CTRL-D 结束 while 循环,代码将一直运行,直到下一次遇到“断点”。根据您放置它们的位置,您可能需要用{local $_; ... } 包装上面的内容以保护$_ 变量。
  • 你说-X不被接受,我不相信。过去 10 年或更长时间发布的每个 Apache httpd 都具有该功能。你一定是做错了什么。
  • 编辑了主帖...

标签: perl apache mod-perl


【解决方案1】:

'Pro Perl Debugging' 这本书有一章是关于“调试 CGI 程序”和一个标题为“配置 mod_perl”的小节。

抱歉,我现在无法访问这本书。

【解决方案2】:

我已经成功运行了 Eclipse 的史诗 perl 模块附带的调试器以及 komodo 调试器。

对于 Komodo,您可以在 apache2.conf 中添加如下内容

<IfDefine DEBUG>
<Perl>
  use ModPerl::Registry;
  use lib qw(/usr/local/lib/perl/Komodo-PerlRemoteDebugging-6.0.3-59641-linux-x86);
  $ENV{PERLDB_OPTS} = "RemotePort=127.0.0.1:9000 LogFile=stderr";
  $ENV{DBGP_IDEKEY} = "yourkey";
  use Apache::DB ();
  Apache::DB->init;
</Perl>
</IfDefine>

按照此处的说明进行操作:http://docs.activestate.com/komodo/4.4/debugperl.html

史诗级

<IfDefine DEBUG>
    PerlModule ModPerl::Registry
    PerlSetEnv PERLDB_OPTS "RemotePort=192.168.x.x:9500 DumpReused ReadLine=0 PrintRet=0"
    PerlSetEnv PERL5DB "BEGIN { $DB::CreateTTY=0; require /path_to_epic_db_scripts/perl5db.pl'; }"
    PerlRequire /path_to_epic_db_scripts/db.pl
    PerlPostConfigRequire /etc/apache2/perl/whatever.pl
</IfDefine>

在此处查看文档:http://www.epic-ide.org/guide/ch06.php

当然,Epic 是免费的,而 Komodo 不是,而且它表明,它仍然相当不错。 我不得不说自从我打电话使用它以来已经有大约 18 个月了,所以这大约是我能记得的。祝你好运……

【讨论】:

    【解决方案3】:

    多年来,我和我公司的其他几个人一直在尝试将调试器附加到 mod_perl。在我们真正到达我们的 ASP 页面中的代码之前,我们已经设法在 mod_perl 进程中的几个点上中断,但是我们从来没有能够在我们的 ASP 页面内部中断。即使我们在代码运行之前中断,然后在我们有趣的代码中对我们的 $DB::single = 1 语句执行“c”,页面也会运行到终止并且不会中断(它似乎跳过了 $DB ::单)。

    我们所有人都认为我们的 perl 版本、perl5db 版本或 mod_perl 版本中存在错误,这使得我们的版本无法做到这一点。我们在 perl 5.8.9 上,还有一些版本的 apache 2,这让我现在无法理解。

    我知道这不是一个答案,但我只是想告诉你这一点,这样即使你最终放弃了,你也不会因为放弃而感到难过。

    我们在使用 mod_perl 时遇到的这个问题是我在我们的网络服务器和我们的应用程序之间插入Plack 层的主要原因之一。有了这个抽象层,我可以在开发中运行一个不同的 Web 服务器——我可以在其中附加一个调试器。我并没有建议您这样做,而是建议您这样做,只是为了让您知道我真的认真对待交互式调试。

    我认为 mod_perl 中交互式调试史诗般的战斗的下一个合乎逻辑的步骤是构建最新版本,看看它是否有效。然后升级我们的 perl 版本,看看是否可行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      相关资源
      最近更新 更多