当我添加以下Java选项以启用调试时:
JAVA_OPTS="$JAVA_OPTS -noverify -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
每当我尝试关闭tomcat时,我都会收到以下错误:
ERROR: transport error 202: bind failed: Address already in use ["transport.c",L41]
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510) ["debugInit.c",L500]
JDWP exit error JVMTI_ERROR_INTERNAL(113): No transports initializedFATAL ERROR in native method: JDWP No transports initialized, jvmtiError=JVMTI_ERROR_INTERNAL(113)
答案 0 :(得分:36)
谢谢你的简短解释,PHeath!根据您的建议,我发现解决问题的最佳方法是使用CATALINA_OPTS而不是JAVA_OPTS 。
查看catalina.sh,可以看到CATALINA_OPTS仅由“start”和“start-security”命令使用,而“stop”命令也使用JAVA_OPTS(至少在openSUSE上使用Tomcat 6.0.33) 12.1)。
至少如果您使用软件包管理器在Linux上安装了Tomcat,那么修改/etc/tomcat6/tomcat6.conf中的CATALINA_OPTS变量(或您的发行版中的任何路径)比直接更改catalina.sh脚本更简洁,包管理器假定用户只更改配置文件,并且在升级Tomcat包时可能会导致出现问题(例如,因为catalina.sh文件被覆盖而丢失设置)。
我认为人们应该更喜欢CATALINA_OPTS而不是JAVA_OPTS,不仅适用于JDWP,还适用于许多其他选项:e。 G。如果使用堆大小选项-Xmx ...那么将它放入CATALINA_OPTS是合理的,因为“stop”命令不需要太多堆。
答案 1 :(得分:28)
您正在尝试在启动时调试tomcat,因此当jvm启动时它会绑定到端口5005。
当你运行catalina.sh stop
时,它会启动另一个jvm,它也会尝试绑定到端口5005。
您需要将调试参数移动到运行并启动tomcat的参数(在catalina.sh
中),将它们直接放入JAVA_OPTS
是导致问题的原因。
答案 2 :(得分:7)
问题是您的tomcat仍然在调试端口(5005)上运行,或者在同一端口(5005)上运行的其他服务。
如果tomcat仍在运行,你可以杀死它
现在你应该可以在没有任何问题的情况下以调试的方式启动服务器。
这可以通过已经通过maven执行的工具(eclipse)进行调试单元测试。除此之外,你可以流动相同的过程。
首先关闭Eclipse并杀死java进程并再次启动它。
答案 3 :(得分:2)
似乎端口5005已经在使用中。使用 netstat 命令检查打开的端口。
这可能是因为你已经打开了tomcat。检查您的流程。
答案 4 :(得分:2)
这是因为两个应用程序在调试模式下运行时都在监听相同的端口号,即8000。
一个快速的解决方案是在startup.bat
中将调试端口更改为8001 SET DEBUGPORT=8001
答案 5 :(得分:1)
看起来你正在启动调试器启动Tomcat,这会导致JVM附加到Process for Debugging,但是在catalina.sh中有一个case语句,用于启动,停止,重启等等。发出stop命令仍然会添加它,因为它是Global JAVA_OPTS的一部分,并尝试启动调试器在同一端口上侦听shutdown命令。如果从JAVA_OPTS中删除address = 50005或使用start jdpa命令通过调试器启动VM,这将解决您的问题。
如果需要干净的副本,请查看最新Tomcat发行版中的默认catalina.sh。听起来有人在你的内部进行了无效更改并导致JDPA在启动,停止和发出任何命令时运行。
答案 6 :(得分:0)
在catalina.bat中设置JPDA_ADDRESS = 8001,即调试端口 并更改server.xml中的所有3个端口