我需要调试一个小程序,该程序是由另一个Java应用程序(WebStart)通过打开浏览器窗口启动的。
在早期的Java版本中,它可以正常工作,但是在Java 1.7_45中,调试仅适用于第一个JVM(即WebStart应用程序)。
我在jcontrol中使用以下参数:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8086
我认为这里没有什么问题,因为调试器已经正确地附加上了。唯一的问题是,我只能调试WebStart应用程序,而不能调试在其后运行的小程序。
无论是WebStart应用程序还是小程序的控制台都显示了这个:
Java Plug-in 10.45.2.18
Using JRE version
1.7.0_45-b18 Java HotSpot(TM) 64-Bit Server VM
JNLP Java进程始于我在jcontrol中设置的
agentlib
选项:/usr/lib/jvm/java-7-oracle/jre/bin/java -Xmx512m -Xms128m
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8086
-Xbootclasspath/a:/usr/lib/jvm/java-7-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-7-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-7-oracle/jre/lib/plugin.jar
-classpath /usr/lib/jvm/java-7-oracle/jre/lib/deploy.jar
-Djnlpx.vmargs="-Xmx512m -Xms128m
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8086"
-Djnlpx.jvm=/usr/lib/jvm/java-7-oracle/jre/bin/java
....
当我从这个Web Start应用程序打开一个小程序进行调试时,Firefox中会打开一个新标签并启动三个进程:
/opt/firefox/plugin-container /usr/lib/jvm/java-7-oracle/jre/lib/amd64/libnpjp2.so -greomni /opt/firefox/omni.ja -appomni /opt/firefox/browser/omni.ja -appdir /opt/firefox/browser 13665 true plugin
/usr/lib/jvm/java-7-oracle/jre/bin/java -D__jvm_launched=8315888593 -D__applet_launched=8315738716 -Xbootclasspath/a:/usr/lib/jvm/java-7-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-7-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-7-oracle/jre/lib/plugin.jar -Djava.class.path=/usr/lib/jvm/java-7-oracle/jre/classes -Dsun.awt.warmup=true sun.plugin2.main.client.PluginMain write_pipe_name=/tmp/.com.sun.deploy.net.socket.13900.6946726655044877700.AF_UNIX
/usr/lib/jvm/java-7-oracle/jre/bin/java -D__jvm_launched=8317712180 -D__applet_launched=8315738716 -Xbootclasspath/a:/usr/lib/jvm/java-7-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-7-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-7-oracle/jre/lib/plugin.jar -Djava.class.path=/usr/lib/jvm/java-7-oracle/jre/classes -Djnlpx.session.data=/tmp/session6916520025949955515 -Dsun.awt.warmup=true sun.plugin2.main.client.PluginMain write_pipe_name=/tmp/.com.sun.deploy.net.socket.13900.3102318208570708149.AF_UNIX
如您所见,调试端口没有作为参数传递给执行applet的命令。
我尝试在applet标签中添加新的调试参数(包括Xdebug和agentlib),但没有任何作用:
<param name="java_arguments" value="-Djnlp.packEnabled=true -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8087">
我也尝试使用appletviewer,解决了pack200库的问题后,却遇到了这个异常:
java.lang.NoClassDefFoundError: netscape/javascript/JSException
at java.lang.Class.getDeclaredConstructors0(Native Method)
但我不认为这是一个解决方案,因为appletviewer无法使用pack200,而且我必须将重复的库添加到服务器上。
是否有可能:
- 为WebStart应用程序和插件定义单独的jdwp端口?
- 在同一个端口上监听两者?
- 选择哪个使用调试?
我在Linux上使用64位Oracle JDK 1.7.0_45-b18和64位Firefox。