3

我正在尝试远程调试 Java 小程序,但似乎无法使 -agentlib:jdwp JVM 参数正常工作。我已经尝试在 Java 控制面板中为使用的特定 JRE 指定它,并且我尝试通过用于启动小程序的 JNLP 文件来设置它。

为小程序启动设置 JVM 参数的正确方法是什么?特别是远程调试。

4

5 回答 5

3

查看类似的 SO question,我找到了以下答案...

有时要调试一些与安全相关的东西,浏览器插件环境与 appletviewer 太不同了。以下是在浏览器中有效调试小程序的方法:

1) 获取二进制文件的调试信息

从 JRE_HOME/lib 备份 .jar 文件

(下载并)安装与您的 JRE 相同版本的 JDK。

将 .jar 文件从 JDK_HOME/jre/lib 复制到 JRE_HOME/lib

JDK 中的文件编译时包含调试信息(源代码行号信息、变量名等),而 JRE 文件没有此信息。

如果没有这个,您将无法在调试器中有意义地进入核心类代码。

2) 启用 Java 插件调试

转到 Java 控制面板/Java/Java 运行时设置/查看/用户/运行时参数

并添加启用调试的选项。像这样的东西:

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

有趣的选项是端口(这里使用 2502,您几乎可以使用任何空闲端口,只需将其写下来以备后用)和挂起 - 如果您需要调试小程序启动、类加载等,请将其设置为“y” . 这样,当您访问小程序页面时,浏览器将显示为冻结,因为 JVM 立即挂起等待调试器连接。

3) 使用您喜欢的 IDE 远程调试 Java 插件

例如,在 Eclipse 中,选择 Run / Debug Configurations ... / Remote Java Application

单击“新建”按钮。

确保连接类型为“Socket Attach”,如果您的浏览器是本地的,则选择 localhost 作为主机,以及您之前选择的端口(示例中为 2502)。

您可能必须在源选项卡上的 JDK 中包含 src.zip 才能使 Java 核心类源可用。

保存配置,一旦您的浏览器正在运行插件(无论 JVM 是否暂停),运行远程调试器以连接到插件 JVM,并打开一个包含您的小程序源的项目。

于 2013-03-08T17:40:47.883 回答
2

此问题已针对 7_u40 进行了修复,可在 java.net 上进行早期访问。否则,Oracle 错误会说这是针对 Java 8 修复的!

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8016005

http://jdk7.java.net/download.html

于 2013-08-09T16:05:43.710 回答
0

您绝对需要在浏览器中运行小程序吗?因为调试小程序的常规方法是使用appletviewer


根据 JPDA 文档(我假设您已经阅读过,基于您已经尝试过的内容),您应该能够在 Java 控制面板中指定代理。我从来没有尝试过这个,文档声称你不能以这种方式中断小程序启动(只需附加到正在运行的小程序),所以我所能做的就是祝你好运。

于 2013-02-21T22:26:56.507 回答
0

我有一个解决方法。好像是 JRE7_u21 没有打开端口,没有挂起,jconsole VM summary 没有显示在 Java 控制面板中配置的 VM 参数。

我降级到 JRE7_u17 并且一切正常。我在 Java 控制面板中的 VM 参数字符串是:

 -agentlib:jdwp=transport=dt_socket,address=8889,server=y,suspend=y,quiet=n,timeout=10000  

它似乎没有

 -Djava.compiler=NONE

没有其他任何工作,甚至没有按照之前的建议替换 lib 文件夹。我什至尝试了一些注册表黑客(更改路径)。

于 2013-04-30T11:00:50.237 回答
0

您可以使用JAVA_TOOL_OPTIONS环境变量来传递默认的 JVM 参数。它会将参数传递给在浏览器中运行的小程序(而不仅仅是小程序)。这种方法甚至适用于 java 7u21 及更高版本。

于 2013-07-24T10:43:51.953 回答