如何在不重新启动的情况下调试mod_perl2模块?

问题描述:

环境:阿帕奇/ 2.2.11(Win32的)mod_apreq2-20051231/2.6.2-dev的的mod_perl/2.0.4-dev的的Perl/v5.10.0如何在不重新启动的情况下调试mod_perl2模块?

情况非常相似,在this discussion list post描述,除了正对Win32的。

我有这个在httpd.conf:

PerlModule Apache2::Reload 
PerlInitHandler Apache2::Reload 
PerlSetVar ReloadAll Off 
PerlSetVar ReloadModules "MyPackage::*" 

...以及只有MOD-perl脚本处理。

我有一个使用MyPackage模块的脚本,它正在工作。

我打破了模块,并重新加载脚本。这个错误很有用,告诉我打破模块的位置。

(如果我在此时重新加载,它只会告诉我“未定义的子程序& ModPerl :: ROOT :: ModPerl :: Registry ...”,因为它无法第一次加载文件。但是,无论哪种方式,下列行为仍然会发生。)

我恢复中断,并触摸脚本文件,以便重新加载模块,然后重新加载。现在,它说:

Attempt to reload MyPackage/Foo.pm aborted. 
Compilation failed in require at E:/dev/test.pl line 4. 

而且即使我触摸脚本和模块,我不能让它正确地重新加载,除非重新启动Web服务器。

打破脚本本身(与模块相对)工作正常:正确的错误并将其更改后会导致重新加载时再次运行。

每这些事情后,我重新启动Web服务器测试前:

  1. 我试着做了痕迹,但它继续 线出错出来是modperl来/ RegistryCooker.pm 行 204,这就是 eval {}是整个脚本的行。

  2. 我试图改变“使用警告 FATAL =>‘所有’”只是“使用 警告”中的脚本和 模块。没有区别。

  3. 我试过禁用我的自定义 $ SIG {__ DIE__}函数。没有 有所作为。 (当然,只有在 当错误出现了,当然, ,但所产生的错误是在 相同)。

  4. 每讨论环节一开始,发现MaxRequestsPerChild已经0这整个的时间,我尝试过ThreadsPerChild 1,但没有区别。我试图MaxRequestsPerChild为1,这解决了这个问题的怪异行为,但每一个请求后重新启动Web服务器:

    Child 7072: Process exiting because it reached MaxRequestsPerChild. Signaling the parent to restart a new child process. 
    Parent: Received restart signal -- Restarting the server. 
    

    这不是一个好的解决办法,因为我有一个的运行的代码显著块第一次碰到一个页面。根据讨论,我运行httpd作为服务,所以我在服务参数窗口中添加了-X,并点击开始,并且它仍在尝试在三分钟后启动一个完整版本(通常在3秒内开始。 )甚至有一个超时消息。通过任务管理器杀死进程并验证无法从Web浏览器访问该页面。从命令行启动httpd -X。仍然是在这个问题的顶部相同的行为。另外我发现奇怪的是-X在我运行httpd时没有列出 - ?.也许它在win32 MPM上不可用?

  5. 在该线程,大卫指出:

    我的经验解决此 问题的种类已表示,其 可能这是 卸包删除存储的的 包空间中的值模块重新加载 (可能设置在BEGIN块时间) 即后续要求没有 还原。

    但是这不是我的代码。我介绍的'破坏脚本'错误只是在已经存在的一个以上添加一个额外的'我的$ var'行,以便第二个会抱怨它已经被声明。

有没有办法对mod_perl2模块工作,而无需每次重装后具有Web服务器重启(是否自动,通过MaxRequestsPerChild,或手动以前一样)?

子复制到你从调用它的脚本,并在复制之前把这个代码:

package MyPackage::Foo; 
no warnings 'redefine'; 

当您完成更改后,移动子回实际模块。

+0

您必须在将其复制回来(有时候!)后重新启动,但无论如何它在此之前都会有所帮助。 – Kev 2009-02-17 21:04:28