Catalina-tomcat中處理異常的一個BUG?
2024-09-06 19:01:04
供稿:網(wǎng)友
本文來源于網(wǎng)頁設計愛好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問。 bea使用的是catalina,也就是tomcat,無意中發(fā)現(xiàn)一個非常隱蔽的也許不算致命的bug,在jsp中某處的標簽如果執(zhí)行錯誤,會在前面某處輸出緩沖區(qū)時無異常退出,而不是在真實錯誤地點發(fā)出錯誤異常。
10:45 分:卻發(fā)現(xiàn)formtag執(zhí)行異常退出,而且錯誤日志沒有任何輸出;所以決定轉(zhuǎn)過去先看看是什么回事。非常奇怪的是,就算在doendtag中輸入斷點后,錯誤日志仍沒有輸出。最后的檢查結(jié)果,不是程序有錯,而是在某種條件下,tag對output沒有響應,所要求輸出的vaildatorscript 只輸出了一半。
這個tag集成了struts.validator的javascriptstatictag,不知有沒有人這樣做:我不想花時間重修把它的代碼解剖出來,也不希望讓前臺的頁面多幾個需要配置的tag;于是直接用上級的formtag向它置值,然后直接調(diào)用它的dostarttag()——其實,在 jsp容器中不也是這樣按注冊記錄調(diào)用它的方法嗎?此前偶而發(fā)現(xiàn)有這樣的錯誤,不過轉(zhuǎn)眼就恢復正常。既然異常消失,錯誤日志也沒有記錄,也就無法發(fā)掘它的錯誤來源了。這次重新出現(xiàn),引起我的注意,而且錯誤持續(xù)時間比較長,于是可以在程序中設置斷點,跟蹤它的錯誤發(fā)生的位置。
結(jié)果,錯誤源集中到了不是我寫的,來自于struts的validator的這個標簽。對于struts這樣的中間構(gòu)件,我現(xiàn)在的態(tài)度是如果我不能完看懂它的代碼,可以在里面設置斷點記錄輸出到錯誤日志degbug,就不加采用,所以現(xiàn)在我手中的struts只是有它的構(gòu)件功能,使用方式與一般所見的struts已經(jīng)是完全不同了,這也包括了這個javascripstatictag。對于它的用法,我是希望它作為程序的一部分,當我選定要對某個表單的客戶端進行驗證時,它自動完成所必需的代碼輸出,而不需要我手工地設這個tag,還要匹配它的調(diào)用函數(shù)名稱。這個集成是成功的,已經(jīng)運行了很長時間,經(jīng)常了一定強度的測試,但平心而論,對于其中的代碼我仍是沒有深入。
錯誤的產(chǎn)生后我打算向緩沖區(qū)輸出斷點,這是由于這個程序是向頁面輸出validator-rules.xml中的javascript代碼,但發(fā)現(xiàn)沒有成功,許多斷點沒有輸出;表明程序輸出是中斷的,但輸出過程是正常的,否則錯誤日志會記錄下來。進一步的驗證表明,程序運行以及從內(nèi)存記錄中獲得的 javascript是完整的,從而排除了讀取xml發(fā)生錯誤的可能性,而且也證明java程序的運行是完全正常的,錯誤不在開發(fā)者程序,而在于平臺本身,在輸出緩沖區(qū)時無異常退出了?。?!由于javascripttag中是使用stringbuffer最后tostring再輸出到緩沖區(qū),或者,是由于這個量太大,所以溢出了??于是我把它分成逐段都輸出,但結(jié)果完全一樣。也許是由于我對于它的調(diào)用不是由容器進行,直接由parent-tag調(diào)用方法造成緩沖區(qū)分配較小??于是改成getstring方法,由parent完成輸出,可是,結(jié)果仍然是一樣的。
最后,我打算先越過這一步,看看執(zhí)行結(jié)果如何,發(fā)現(xiàn)該頁由于bselecttag由于調(diào)關(guān)聯(lián)的baseif接口昨晚錯刪除了一個方法出現(xiàn)異常,于是重新編譯后,再執(zhí)行,結(jié)果發(fā)現(xiàn)上面的錯誤消失了。重新恢復這個錯誤,異常重新出現(xiàn)。這樣也就發(fā)現(xiàn)了它的原因。事實上,bea使用的是catlinajsp 容器,解釋一個jsp頁面時是一個統(tǒng)一的過程。這個異常表明,在jsp中前后的輸出文本生成是相關(guān)聯(lián)的,位于后面的程序運行錯誤,象這里,是在后面運行時出現(xiàn)了methodnofound(我估計,因為即使是服務器日志也沒有發(fā)現(xiàn)錯誤記錄),也令這個解釋執(zhí)行過程中斷,造成緩沖區(qū)文本輸出一半無異常退出。
我很少處理jsp,這是一個經(jīng)驗,如果出現(xiàn)這種緩沖異常輸出而程序捕捉不到任何的錯誤日志時,先把這個頁面相關(guān)的程序都編譯一遍,排除這個可能再說。
這個問題整整花了我兩個小時找原因,的確隱蔽,一些副作用是這樣就對validator.javascript的代碼熟悉了,項目后面有點時間的話,就把它修改一下,只輸出這次需要的驗證方法script:我總覺得它輸出了太多的東西,把validator_rules.xml中的所有 script方法全送出來了。