Catalina-tomcat中处理异常的一个BUG?

 BEA使用的是Catalina,也就是tomcat,无意中发现一个非常隐蔽的也许不算致命的BUG,在JSP中某处的标签如果执行错误,会在前面某处输出缓冲区时无异常退出,而不是在真实错误地点发出错误异常。
10:45 分:却发现FormTag执行异常退出,而且错误日志没有任何输出;所以决定转过去先看看是什么回事。非常奇怪的是,就算在doEndTag中输入断点后,错误日志仍没有输出。最后的检查结果,不是程序有错,而是在某种条件下,tag对output没有响应,所要求输出的vaildatorscript 只输出了一半。

这个tag集成了struts.validator的JavascriptStaticTag,不知有没有人这样做:我不想花时间重修把它的代码解剖出来,也不希望让前台的页面多几个需要配置的tag;于是直接用上级的FormTag向它置值,然后直接调用它的doStartTag()——其实,在 JSP容器中不也是这样按注册记录调用它的方法吗?此前偶而发现有这样的错误,不过转眼就恢复正常。既然异常消失,错误日志也没有记录,也就无法发掘它的错误来源了。这次重新出现,引起我的注意,而且错误持续时间比较长,于是可以在程序中设置断点,跟踪它的错误发生的位置。

结果,错误源集中到了不是我写的,来自于struts的validator的这个标签。对于struts这样的中间构件,我现在的态度是如果我不能完看懂它的代码,可以在里面设置断点记录输出到错误日志degbug,就不加采用,所以现在我手中的struts只是有它的构件功能,使用方式与一般所见的struts已经是完全不同了,这也包括了这个javascripStaticTag。对于它的用法,我是希望它作为程序的一部分,当我选定要对某个表单的客户端进行验证时,它自动完成所必需的代码输出,而不需要我手工地设这个TAG,还要匹配它的调用函数名称。这个集成是成功的,已经运行了很长时间,经常了一定强度的测试,但平心而论,对于其中的代码我仍是没有深入。

错误的产生后我打算向缓冲区输出断点,这是由于这个程序是向页面输出validator-rules.xml中的javascript代码,但发现没有成功,许多断点没有输出;表明程序输出是中断的,但输出过程是正常的,否则错误日志会记录下来。进一步的验证表明,程序运行以及从内存记录中获得的 javascript是完整的,从而排除了读取xml发生错误的可能性,而且也证明JAVA程序的运行是完全正常的,错误不在开发者程序,而在于平台本身,在输出缓冲区时无异常退出了!!!由于javascriptTag中是使用stringBuffer最后toString再输出到缓冲区,或者,是由于这个量太大,所以溢出了??于是我把它分成逐段都输出,但结果完全一样。也许是由于我对于它的调用不是由容器进行,直接由parent-TAG调用方法造成缓冲区分配较小??于是改成getString方法,由parent完成输出,可是,结果仍然是一样的。

最后,我打算先越过这一步,看看执行结果如何,发现该页由于BSelectTag由于调关联的BaseIf接口昨晚错删除了一个方法出现异常,于是重新编译后,再执行,结果发现上面的错误消失了。重新恢复这个错误,异常重新出现。这样也就发现了它的原因。事实上,BEA使用的是CATLINAJSP 容器,解释一个JSP页面时是一个统一的过程。这个异常表明,在JSP中前后的输出文本生成是相关联的,位于后面的程序运行错误,象这里,是在后面运行时出现了methodnofound(我估计,因为即使是服务器日志也没有发现错误记录),也令这个解释执行过程中断,造成缓冲区文本输出一半无异常退出。

我很少处理JSP,这是一个经验,如果出现这种缓冲异常输出而程序捕捉不到任何的错误日志时,先把这个页面相关的程序都编译一遍,排除这个可能再说。

这个问题整整花了我两个小时找原因,的确隐蔽,一些副作用是这样就对validator.javascript的代码熟悉了,项目后面有点时间的话,就把它修改一下,只输出这次需要的验证方法script:我总觉得它输出了太多的东西,把validator_rules.xml中的所有 script方法全送出来了。

时间: 2025-01-25 00:06:15

Catalina-tomcat中处理异常的一个BUG?的相关文章

关于Oracle中重启数据库的一个bug

关于drop database在oracle中是致命的操作,这个操作自己在测试环境中体验过,会完全删除数据文件,因此这个操作非常敏感但是实用性不强,不过话说过来,这个操作也不是随便就能执行的,除了操作敏感的权限之外,其实还是有一些前提条件的. 在数据库open状态,是无法运行这个命令的.SQL> drop database TEST;drop database TEST              *ERROR at line 1:ORA-00933: SQL command not proper

问一个web在tomcat中的servlet简单问题,刚学servlet编译一个文件通不过

问题描述 问一个web在tomcat中的servlet简单问题,刚学servlet编译一个文件通不过 在我tomcat中运行后 打开自己编写的一个HelloServlet文件打不开.怎么解决好? 错误500 type Exception report message description The server encountered an internal error () that prevented it from fulfilling this request. exception ja

javafx-JavaFX开发中遇到的一个BUG,

问题描述 JavaFX开发中遇到的一个BUG, 大神们,我现在有个这样的按钮列表,然后多条数据的话右边会有个下拉条,但是现在就是拉动右边的下拉条,左边按钮列表里的按钮就会乱跳动,然后排查了下原因是因为每次拉动下拉条的时候会调用一个updateItem()的方法,而此方法里有个index的,每次拉动下拉条index都变变,现在有什么办法可以让拉到下拉条的时候index不改变呢?

震网蠕虫中的一个Bug差点令其“出师未捷身先死”

本文讲的是震网蠕虫中的一个Bug差点令其"出师未捷身先死",由于内部代码中存在一个Bug,使其可以感染古老的Windows系统.超级蠕虫病毒震网(Stuxnet)差一点暴露,从而无法完成破坏. 业内众所周知,该病毒可以隐秘地破坏控制离心机的计算机系统.它由美国和以色列的神秘黑客所设计,被用于破坏位于伊朗那达兹郡的铀浓缩设施.该病毒导致伊朗的浓缩铀项目推迟了两年之久,但由于其自身的代码缺陷,震网差点未能发挥作用. 为了完成行动目标,Stuxnet必须保证自己无法被伊朗人检测到.不幸的是,

关于javascript中parseInt函数的一个所谓的bug

javascript|函数 最近我正在升级一个日历控件,出现了一些莫名其妙的错误,最后发现原来是一个parseInt函数的一个所谓的bug引起的,就是在 parseInt("08") 和 parseInt("09") 处理时返回的居然都是 0 ,而 parseFloat函数就没有这样的错误,没办法,我将所有用到parseInt函数的地方都改成了parseFloat函数. 最后经过测试才发现,原来当前面有0的时候,parseInt默认把它当作八进制处理了,01--07

Tomcat中DataSource的配置方法

很多网上的文章都在说要改Server.xml,包括我手上的一本<Eclipse 从入门到精通>.不过经过今天的噩梦般的体验,最终还是没有改Server.xml,把DataSource配置好了.中间走过无数弯路,包括把 Tomcat从5.5.9降到5.0.28(最终还是没有用5.5.9,周围人都说,不要用最新的东西--实验室的都在用4.1--). 先说一下关于Tomcat 5.5.9的问题,由于Tomcat5.5.9没有带上admin包,必须要自己下,下完以后复制到对应的目录.另外还有一重要步骤

断网故障时Mtop触发tomcat高并发场景下的BUG排查和修复(已被apache采纳)

该文章来自阿里巴巴技术协会(ATA)精选集 目录 现象 NIO模式背景介绍 排查过程 结合业务场景解释问题产生的原因 进一步的发现 解决办法 向Apache社区的反馈 总结 现象 mtop的机器,环境为Ali-Tomcat 7.0.54.2,连接器采用的是NIO模式,在高流量(约1000 qps)的情况下,在Tomcat的启动后一段时间内,抛出ConcurrentModificationException,然后再过一段时间后,Tomcat无法再接受新的请求. 异常堆栈如下: Exception

Tomcat中JVM内存溢出及合理配置

Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机.Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识进行详细介绍. 一.Java JVM内存介绍 JVM管理两种类型的内存,堆和非堆.按照官方的说法:"Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时创建的.""在JVM中堆之外的内存称为非堆内存(Non-heap

Tomcat中的ssl安全信道的实现

为了实现https协议通信,tomcat需要利用JSSE把SSL/TLS协议集成到自身系统上,通过上一节我们知道不同的厂商可以实现自己的JSSE,而tomcat默认使用的是以前sun公司开发实现的包而且由JDK自带.Tomcat实现http及https通信的基础是什么?其实http与https的不同就是在创建通信套接字服务器时的不同,http是没有任何加密措施的套接字服务器,而https是靠嵌套了一层密码机制的套接字服务器.在实现时只需根据实际通信情况创建对应的套接字服务器,这时你应该果断想起工