我正在尝试远程调试Java applet,但我似乎无法让-agentlib:jdwp JVM参数工作。我已经尝试在Java控制面板中为所使用的特定JRE指定它,并且我尝试通过用于启动applet的JNLP文件来设置它。
为applet启动设置JVM参数的正确方法是什么?特别要远程调试。
答案 0 :(得分:3)
看similar SO question,我找到了以下答案......
有时为了调试一些安全相关的东西,浏览器插件环境与appletviewer太不一样了。以下是在浏览器中有效调试applet的方法:
1)获取二进制文件的调试信息
从JRE_HOME / lib
备份.jar文件(下载并)安装与JRE版本相同的JDK。
将.jar文件从JDK_HOME / jre / lib复制到JRE_HOME / lib
JDK中的文件是使用包含的调试信息(源代码行号信息,变量名等)编译的,而JRE文件没有这些信息。
如果没有这个,你将无法在调试器中有意义地进入核心类代码。
2)启用Java Plug-in的调试
转到Java控制面板/ Java / Java运行时设置/视图/用户/运行时参数
并添加选项以启用调试。像这样:
-Djava.compiler=NONE -Xnoagent -Xdebug -Xrunjdwp:transport=dt_socket,address=2502,server=y,suspend=n
有趣的选项是端口(在这里使用2502,几乎可以使用任何空闲端口,只需将其写下来以供日后使用)和暂停 - 如果需要调试applet启动,类加载等,请将此设置为“Y”。这样,当您访问applet页面时,浏览器似乎会冻结,因为JVM会立即暂停,等待调试器连接。
3)使用您喜欢的IDE远程调试Java Plug-in
例如,在Eclipse中,选择“运行/调试配置... /远程Java应用程序”
点击“新建”按钮。
确保连接类型为“Socket Attach”,如果您的浏览器是本地的,请选择localhost作为主机,并选择之前选择的端口(示例中为2502)。
您可能必须在源选项卡上的JDK中包含src.zip以使Java核心类源可用。
保存配置,一旦浏览器运行插件(JVM暂停或不挂起),运行远程调试器连接到插件JVM,项目包含打开的applet源。
答案 1 :(得分:2)
此问题已针对7_u40修复,可在java.net上进行早期访问。否则Oracle错误说这是针对Java 8修复的!
答案 2 :(得分:0)
您是否绝对需要在浏览器中运行applet?因为调试applet的常规方法是使用appletviewer。
根据JPDA文档(我假设您已经阅读过,基于您已经尝试过的内容),您应该能够在Java控制面板中指定代理。我从来没有试过这个,并且文档声称你不能以这种方式中断applet的启动(只需附加到正在运行的applet),所以我所能做的就是祝你好运。
答案 3 :(得分:0)
我有一个解决方法。看起来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文件夹。我甚至尝试过一些注册表黑客攻击(改变路径)。
答案 4 :(得分:0)
您可以使用JAVA_TOOL_OPTIONS环境变量来传递默认的JVM参数。它会将params传递给在浏览器中运行的applet(而不仅仅是applet)。这种方法甚至可以在java 7u21及更高版本上使用。