我正在尝试远程调试Java小程序,但无论如何似乎都不能使 -agentlib:jdwp JVM 参数生效。我已经尝试在特定JRE的Java控制面板中指定它,并且也尝试通过用于启动小程序的JNLP文件进行设置。
什么是正确的方法来设置小程序启动的JVM参数?特别是,用于远程调试。
我正在尝试远程调试Java小程序,但无论如何似乎都不能使 -agentlib:jdwp JVM 参数生效。我已经尝试在特定JRE的Java控制面板中指定它,并且也尝试通过用于启动小程序的JNLP文件进行设置。
什么是正确的方法来设置小程序启动的JVM参数?特别是,用于远程调试。
看了一个类似的SO问题,我发现了以下答案...
有时候为了调试一些与安全相关的东西,浏览器插件环境与appletviewer之间的差异太大了。以下是您可以采取的有效方法来调试浏览器中的applets:
1)获取二进制文件的调试信息
备份JRE_HOME/lib下的.jar文件
(下载并)安装与您的JRE版本相同的JDK。
将JDK_HOME/jre/lib中的.jar文件复制到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
3) 使用您喜欢的IDE进行远程调试Java插件
例如,在Eclipse中,选择运行 / 调试配置... / 远程Java应用程序
点击“新建”按钮。
确保连接类型为“Socket Attach”,如果您的浏览器是本地的,则选择localhost作为主机,以及您之前选择的端口(在此示例中为2502)。
您可能需要在源代码选项卡上包含您的JDK中的src.zip,以便Java核心类源代码可用。
保存配置,一旦您的浏览器运行插件(无论JVM是否暂停),请运行远程调试器以连接到插件JVM,其中包含打开您的applet源码的项目。
我有一个解决方法。似乎是JRE7_u21无法打开端口,无法挂起,并且jconsole VM摘要不显示在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文件夹也不行。我甚至尝试了一些注册表修改(更改路径)。
你是否绝对需要在浏览器中运行小程序?因为调试小程序的正常方式是使用appletviewer。
您可以使用JAVA_TOOL_OPTIONS环境变量来传递默认的JVM参数。它将把这些参数传递给在浏览器中运行的小程序(而不仅仅是小程序)。即使在Java 7u21及更高版本中,这种方法也能正常工作。