2009-02-11 57 views
3

環境:阿帕奇/ 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,或手動以前一樣)?

回答

2

子複製到你從調用它的腳本,並在複製之前把這個代碼:

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

當您完成更改後,移動子回實際模塊。

+0

您必須在將其複製回來(有時候!)後重新啓動,但無論如何它在此之前都會有所幫助。 – Kev 2009-02-17 21:04:28

相關問題