当前位置: 首页 > 知识库问答 >
问题:

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

哈翔
2023-03-14

我需要通过打开浏览器窗口调试一个由另一个java应用程序(webstart)启动的小程序。它在旧版本的java上运行良好,但是在Java1.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
....

当我打开要从此webstart应用程序调试的小程序时,会打开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标记(我尝试了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)

但我不认为这是一个解决方案,因为AppTeVIEW不与PAC200一起工作,我必须向服务器添加重复的库。

是否有可能:

  1. 为webstart应用程序和插件定义单独的jdwp端口
  2. 在同一端口上侦听这两个端口
  3. 选择调试将用于哪一个

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

共有1个答案

岑俊弼
2023-03-14

这不是一个真正的解决方案,但我的问题有一个解决办法。

  • 清除jcontrol中的java参数
  • 启动webstart应用程序
  • 再次添加java参数
  • 运行小程序

之后,参数只传递给applet,调试工作正常。

 类似资料:
  • 问题内容: 程应在同一瞬间开始。我了解,如果你这样做,则下次执行之前需要花费几毫秒的时间。 可能还是不可能?线程应该在同一瞬间开始。我知道,如果你执行,则下次执行thread2.start()需要几毫秒。 这是可能的还是不可能的? 问题答案: 要完全同时(至少尽可能好)启动线程,可以使用CyclicBarrier: 这不必是,你也可以使用 这仍然无法确保它们已正确启动 在其他平台上,确切地说启动线

  • 我有一个Java Web Start应用程序,我使用它通过一个快捷方式启动: 但是在安装了JDK 1.8之后,它都停止了工作,我的javaws没有看到任何额外的X||D参数。我尝试过这种方式: 但没用。 我找到的唯一解决方案是使用Java控制面板设置参数,将它们直接添加到JVM中。 我如何设置参数为1.8好的旧方式? P.S.JDK 1.6 x32仍然可以很好地使用快捷方式。x64 1.7启动,但

  • 问题内容: 我正在尝试在Windows主机上的PyCharm和运行django应用程序的debian虚拟主机之间进行调试。说明说要安装egg,添加导入,然后调用命令。我认为这些事情需要在debian主机上完成吗? 好吧,那我应该把这两行放在哪个文件中? 我尝试将其放入settings.py中,但是得到了这种东西… pycharm只是坐在那里“等待连接” 问题答案: PyCharm(或你的选择依据)

  • 我有2个工作线程和1个处理线程。 当处理线程正在尝试处理某些事情,而辅助线程正在执行它们的工作时,处理线程应该等待,并且在辅助线程中执行的所有作业完成时唤醒。 我怎样才能唤醒这根线?我将尝试演示我在这段伪代码中的意思 处理线程类似于 这样的事情可能发生吗?让线程等待到多个调用notifyAll()的源,而不是只等待一次。我希望我把这个问题弄清楚了。 多谢帮忙!

  • 问题内容: 不是Java中的关键字。JVM如何知道将方法作为任何程序的起点执行? 问题答案: 不需要是Java中的关键字即可让JVM在执行开始时查找它。与其他也称为的方法或变量没有冲突。这就是JVM规范的设计方式。它很可能是从c语言借来的。 Java规范参考:关键字,调用main。