Ubuntu 14.04下RSA 9.6启用调试模式启动失败(退出码160)求助
你遇到的核心问题是IBM J9虚拟机的JDWP调试参数规则限制——错误日志里的Specify launch=<command line> when using onthrow or onuncaught option已经明确提示:当使用onthrow或onuncaught选项时,必须同时指定launch参数,定义异常触发时要启动的调试器命令。这和OpenJDK的JDWP行为不同,也是导致JVM初始化失败(Exit code=160)的直接原因。
下面给出两种针对性的解决方案:
方案1:移除onthrow参数(推荐,适合常规调试)
如果你只是需要全程监听调试端口,等待外部调试器连接,完全不需要onthrow触发逻辑,直接修改JDWP参数即可:
修改eclipse_debug.ini中的调试参数段:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
方案2:添加launch参数(保留onthrow触发逻辑)
如果你确实需要仅在抛出PlugletDebugException时启动调试,必须添加launch参数指定调试器路径(比如gdb或Eclipse调试客户端的启动命令):
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,onthrow=com.ibm.xtools.pluglets.ui.internal.debug.PlugletDebugException,address=8000,launch=/path/to/your/debugger
注意替换/path/to/your/debugger为实际的调试器执行路径,例如你用Eclipse作为调试客户端的话,可以指定Eclipse的启动命令。
修改后的完整eclipse_debug.ini示例(方案1)
-vm jdk/jre/bin/javaw --launcher.library plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.400.v20160518-1444 -install /opt/IBM/SDP_96 --launcher.GTK_version --launcher.appendVmargs 2 -startup plugins/org.eclipse.equinox.launcher_1.3.200.v20160318-1642.jar -vmargs -Xquickstart -Xms512m -Xmx1536m -Xmnx64m -Xgcpolicy:gencon -Xscmx96m -Xshareclasses:name=IBMSDP_%u -XX:MaxPermSize=512M -Xcompressedrefs -Xj9 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -Dcom.ibm.ws.management.event.max_polling_interval=1000 -Djava.util.Arrays.useLegacyMergeSort=true
重新启动验证
执行原启动命令:
cd /opt/IBM/SDP_96 ./eclipse -product com.ibm.rational.rsa4ws.product.v96.ide --launcher.ini ./eclipse_debug.ini
如果用方案1,启动后JVM会正常监听8000端口,你可以在Eclipse调试客户端中新建远程调试配置,连接该端口即可开始调试。
额外说明
IBM J9的JDWP设计逻辑和OpenJDK有差异:onthrow/onuncaught选项的初衷是当指定异常发生时,自动启动一个调试器进程附加到JVM,而不是等待外部调试器主动连接。如果没有特殊需求,方案1的常规远程调试模式更简单易用。
内容的提问来源于stack exchange,提问作者aibrahim

