8

我正在尝试将 Perl 调试器附加到 Apache 和 mod_perl。我们的环境非常复杂(使用 Apache 配置了很多额外的东西(例如 Catalyst))并且配置它的工程师不再在公司工作。我已按照 Apache 网站上的说明进行设置,设置“PerlFixupHandler Apache::DB”等,但到目前为止,我得到的只是 在页面交付后中断调试器。我猜我在调度过程中得到了中断,而不是工作进程。我正在运行 Apache 的 prefork MPM 版本。调试说明说在启动 httpd 时传递 -X 参数。但是我正在运行的 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]
4

3 回答 3

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 个月,所以这大约是我能记得的。祝你好运....

于 2013-01-16T20:06:33.387 回答
2

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

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

于 2011-06-14T08:07:40.243 回答
0

多年来,我和我公司的其他几个人一直在尝试将调试器附加到 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 版本,看看是否可行。

于 2012-04-25T10:45:17.457 回答