如果有两个JVM启动,如何调试小程序?

5

我需要调试一个小程序,该程序是由另一个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,而且我必须将重复的库添加到服务器上。

是否有可能:

  1. 为WebStart应用程序和插件定义单独的jdwp端口?
  2. 在同一个端口上监听两者?
  3. 选择哪个使用调试?

我在Linux上使用64位Oracle JDK 1.7.0_45-b18和64位Firefox。

1个回答

1

并不是真正的解决办法,但我找到了一个解决我的问题的变通方法。

  • 清除jcontrol中的java参数
  • 启动WebStart应用程序
  • 重新添加java参数
  • 运行小程序

之后,参数仅传递给小程序,调试也可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接