環境:阿帕奇/ 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服務器測試前:
我試着做了痕跡,但它繼續 線出錯出來是modperl來/ RegistryCooker.pm 行 204,這就是 eval {}是整個腳本的行。
我試圖改變「使用警告 FATAL =>‘所有’」只是「使用 警告」中的腳本和 模塊。沒有區別。
我試過禁用我的自定義 $ SIG {__ DIE__}函數。沒有 有所作爲。 (當然,只有在 當錯誤出現了,當然, ,但所產生的錯誤是在 相同)。
每討論環節一開始,發現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上不可用?
在該線程,大衛指出:
我的經驗解決此 問題的種類已表示,其 可能這是 卸包刪除存儲的的 包空間中的值模塊重新加載 (可能設置在BEGIN塊時間) 即後續要求沒有 還原。
但是這不是我的代碼。我介紹的'破壞腳本'錯誤只是在已經存在的一個以上添加一個額外的'我的$ var'行,以便第二個會抱怨它已經被聲明。
有沒有辦法對mod_perl2模塊工作,而無需每次重裝後具有Web服務器重啓(是否自動,通過MaxRequestsPerChild,或手動以前一樣)?
您必須在將其複製回來(有時候!)後重新啓動,但無論如何它在此之前都會有所幫助。 – Kev 2009-02-17 21:04:28