网址:http://www.51testing.com/html/45/178045-210929.html
作者:yimuli
问题描述:
在使用AppScan工具对WEBService机器进行扫描的时候,经常会发现Tomcat的 日志 记录中会有异常信息(本文以Tomcat服务器为例):ERROR: transport error 202: handshake Failed - received >GET /manaager/< - excepted >JDWP-Handsh
ake< ["transport.c",L41]
JDWP exit error jvmti_ERROR_NONE(0): Could not connect,timeout or Fatal error
再一检查Tomcat进程,无故停止,使得整个WEBService当机,影响整个系统环境。
问题分析
通过网上查询错误信息,发现是Tomcat服务开启了JPDA功能。而在进行AppScan扫描的同时,也会覆盖到JPDA的端口。此端口是用来进行 Socket连接的,主要目的是用来对 Java 程序进行远程调试,一旦该端口被占用,则JVM在此监听端口上则会被挂起,导致整个Java程序中断,这就 是根因所在。只要关闭JPDA功能即可。
操作步骤:
Step 1:编辑TOMCAT目录/bin下的startup.sh文件;
Step 2:修改最后一行,将exec "$PRGDIR"/"$EXECUTABLE" jpda start "$@"中的" jpda "删除(注意,前后要加空格);
Step 3:保存后,重启startup.sh;
附:JPDA所开启的监听端口在TOMCAT目录/bin下的catalina.sh文件配置,搜索该文件的“JDPA_ADDRESS=”字样,其值便是端口号。
这里对JPDA作一个简单的介绍。
JVM提供了一个调试架构对Java程序进行调试的功能,这就是JPDA(Java Platform. Debugger ArchitectureJava平台调试架构),JPDA通过调试交互协议向JVM请求服务以及对JVM中运行的程序进行调试。
JPDA通过两个接口和协议来完成如上功能,分别是jvmti(Java虚拟机工具接口),jdi(Java调试接口)和JDWP(Java调试连线协议)。其中
1)jvmti定义了虚拟机应该提供的调试服务,包括调试信息(information譬如栈信息)、调试行为(Action譬如客户端设置一个断点)和通知(Notification譬如到达某个断点时通知客户端),该接口由虚拟机实现者提供实现,并结合在虚拟机中;
2)jdi在语言的高层次上定义了调试者可以使用的调试接口以能方便地与远程的调试服务进行交互,Java语言实现,调试器实现者可直接使用该接口访问虚拟机调试服务;
3)JDWP定义调试服务和调试器之间的通信,包括定义调试信息格式和调试请求机制。
JPDA 概念将调试过程分为两部分:被调试的程序(被调试者-debuggee)和jdi。jdi一般为一个调试应用程序的用户接口(或Java IDE的一部分)。被调试的应用程序在后端运行,而jdi在前端运行。在前端与后端之间有一个通信通道运行JDWP协议;因此,被调试程序与调试器可以位 于同一个系统内,也可位于不同的系统中。调试器的后端负责由调试器前端向被调试者VM传输请求,如“告诉我变量X的值”;它还负责向前端传输对这些请求 (包括像到达断点之类的预计事件)的响应。后端与前端利用JDWP通过一个通信通道进行通信。后端与被调试者VM利用jvmti进行通信。