一、背景

用JBOSS启动应用服务、有问题后需要进行远程调试

二、操作

1、在jboss配置远程调试参数并启动

修改jboss\bin目录下的run.bat文件

rem set JAVA_OPTS=-classic -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y %JAVA_OPTS%
set JAVA_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y %JAVA_OPTS%

启动后会停止,等调试器启动后在运行

java6运行:

java8运行:

2、eclipse上启动远程调试

启动后就可以打断点进行debug调试了

三:不同jdk的问题

问题:-classic到底是干什么用的?因为之前默认有这个所以没删,测试发现用java8启动失败后删了就好了。

远程参数中加了JAVA_OPTS=-classic

set JAVA_OPTS=-classic -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y %JAVA_OPTS%

用java6测试提示这个,但是可以正常调试:

用java8测试运行不起来:

注意:不同java版本可能支持的参数不一样

四、各参数含义说明

-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y

1、-Xdebug

    让jvm在调试模式下运行,必须开启

2、-Xnoagent

    禁用默认的sun默认的调试器

3、-Djava.compiler=NONE

    禁止jvm加载JIT编译器

4、-Xrunjdwp:transport=dt_socket

   让jvm加载jdwp(java debug wire protocol,java调试网络协议)的实现。

   transport协议传输方式,dt_sorket表示使用套接字进行传输。

5、server=y

     debug需要调试器(eclipse是一种调试器)和目标应用程序(待调试的程序)协同工作,这样才能有效调试,因此,调试链路有两个节点:调试器和目标应用程序。这两个节点都可以作为服务端,等待对方的连接,该参数就是控制究竟哪一方作为服务端的。该参数有两种取值:

     y:目标应用程序作为服务端。应用程序开启debug模式,启动应用,然后调试器进行连接。

     n:调试器作为服务端。

6、address=8787

      套接字传输的端口号

7、suspend=y

     是否延迟加载jvm。

      y:运行程序启动脚本后,发现jvm会暂停,直到调试器连接过来后,jvm会继续加载。。

      n:运行程序启动脚本后,jvm自动加载,然后开启debug端口号。调试器随时连接到jvm。

五、待考虑

1、JAVA_OPTS=-classic, -classic的作用?

2、server=y、suspend=y,值改成 n 之后,怎么调试?

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐