如何将调试器与mod_perl一起使用

时间:2011-04-07 18:20:25

标签: perl apache mod-perl

我正在尝试将Perl调试器附加到Apache和mod_perl。我们的 环境非常复杂(许多额外的东西(例如Catalyst) 配置Apache)和配置它的工程师没有 与公司更长的时间。我按照Apache上的说明进行操作 网站,设置'PerlFixupHandler Apache :: DB'等。 但到目前为止,我得到的只是在之后进入调试器 页面已经发送。我猜我得到了突破 调度过程,而不是工作进程。我正在运行prefork MPM Apache的版本。调试说明说明时传递-X参数 开始httpd。但是我正在运行的httpd不接受-X参数。 我假设-X param实际上会导致某些版本的httpd转为NOT fork?

赞赏任何和所有指导。

$ ./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]

3 个答案:

答案 0 :(得分:2)

本书'Pro Perl Debugging'有一章关于'调试CGI程序'和一章标题为'配置mod_perl'。

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

答案 1 :(得分:2)

我已经成功运行了eclipse的epic 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个月了,所以这就像我记得的那样多。祝你好运....

答案 2 :(得分:0)

我和我公司的其他几个人一直试图将调试器附加到mod_perl多年。在我们实际访问ASP页面中的代码之前,我们已经设法在mod_perl进程中的几个点中断,但是我们从来没有能够打破我们的ASP页面。即使我们在代码运行之前中断,然后在我们感兴趣的代码中的'c'到我们的$ DB :: single = 1语句,页面也会运行到终止并且不会中断(它似乎跳过$ DB ::单)。

我们所有人都认为我们的perl版本,我们的perl5db版本或我们的mod_perl版本中存在一个错误,这使我们的版本无法做到这一点。我们正在使用perl 5.8.9,而某些版本的apache 2目前让我失望。

我知道这不是一个答案,但我只想告诉你这一点,如果你最终放弃,你就不会放弃。

我们对mod_perl的这个问题是我在我们的网络服务器和我们的应用程序之间插入Plack层的主要原因之一。有了这个抽象层,我可以在开发中运行一个不同的Web服务器 - 我可以在其中附加一个调试器。我并没有像你提到的那样关联这一点,只是因为你知道我真的认真对待交互式调试。

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