我正在尝试远程调试 Java 小程序,但似乎无法使 -agentlib:jdwp JVM 参数正常工作。我已经尝试在 Java 控制面板中为使用的特定 JRE 指定它,并且我尝试通过用于启动小程序的 JNLP 文件来设置它。
为小程序启动设置 JVM 参数的正确方法是什么?特别是远程调试。
我正在尝试远程调试 Java 小程序,但似乎无法使 -agentlib:jdwp JVM 参数正常工作。我已经尝试在 Java 控制面板中为使用的特定 JRE 指定它,并且我尝试通过用于启动小程序的 JNLP 文件来设置它。
为小程序启动设置 JVM 参数的正确方法是什么?特别是远程调试。
查看类似的 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,并打开一个包含您的小程序源的项目。
此问题已针对 7_u40 进行了修复,可在 java.net 上进行早期访问。否则,Oracle 错误会说这是针对 Java 8 修复的!
您绝对需要在浏览器中运行小程序吗?因为调试小程序的常规方法是使用appletviewer。
根据 JPDA 文档(我假设您已经阅读过,基于您已经尝试过的内容),您应该能够在 Java 控制面板中指定代理。我从来没有尝试过这个,文档声称你不能以这种方式中断小程序启动(只需附加到正在运行的小程序),所以我所能做的就是祝你好运。
我有一个解决方法。好像是 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 文件夹。我什至尝试了一些注册表黑客(更改路径)。
您可以使用JAVA_TOOL_OPTIONS环境变量来传递默认的 JVM 参数。它会将参数传递给在浏览器中运行的小程序(而不仅仅是小程序)。这种方法甚至适用于 java 7u21 及更高版本。