你如何调试Java Applets?

时间:2009-05-15 11:17:40

标签: java debugging applet

目前,我所拥有的唯一信息是浏览器状态栏中的单行错误消息。

你知道如何获得堆栈跟踪吗?

7 个答案:

答案 0 :(得分:53)

除了明显使用Java控制台和applet查看器之外,从Java 6更新7开始,您可以使用JDK附带的VisualVM(JDK_HOME / bin / visualvm)。它允许您查看每个线程的堆栈跟踪,甚至可以查看所有对象实例。

AppletViewer非常方便,您可以从Eclipse运行“Run as / Java Applet”,或者“Debug As / Java Applet”来调试您的applet类。

但是,有时为了调试一些安全相关的东西,浏览器插件环境与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 :(得分:26)

This article is a bit old但仍然相关(包括标题为“如何在Java插件中调试Applet”的部分)。

编辑:获得堆栈跟踪的更好方法是使用Java plugin console。如果您在该窗口中点击“t”,您将看到以下内容:

  

打印出所有现有线程   组。显示的第一组是Group   主要。 ac代表活动计数;它   是活动线程的总数   在线程组及其子线程中   组。 agc代表活跃组   计数;它是活跃的数量   线程组的子线程组。   pri代表优先权;它是   线程组的优先级。以下   组主,其他线程组将   显示为Group,其中name   是与applet关联的URL。   个别线程列表将   显示线程名称,线程   如果线程处于活动状态,则优先级为alive   如果线程在,则被破坏   被摧毁的过程和守护进程   如果该线程是一个守护程序线程。

我在该控制台中经常使用的另一个命令是0-5的跟踪级别:

  

这将设置跟踪级别选项,如下一节Tracing and Logging.

中所述

从该页面,您会看到级别如下所示:

  
      
  • 0 - 关闭
  •   
  • 1 - 基本
  •   
  • 2 - 网络,缓存和基本
  •   
  • 3 - 安全,网络和基本
  •   
  • 4 - 扩展,安全,网络和基本
  •   
  • 5 - LiveConnect,扩展,安全,网络,临时和基本
  •   

这些工具都非常有用,因为您正试图解开世界上已经进入applet头部的问题。我知道他们为我工作过。

答案 2 :(得分:3)

applet viewer支持调试选项。

答案 3 :(得分:3)

来自未捕获异常的堆栈跟踪将显示在控制台中。这可以从Java控制面板(高级> Java控制台>显示控制台)启用,或者某些浏览器具有各种选项或插件以启用它。

您可以将调试器附加到正在运行的PlugIn进程。

也许最好的办法就是不进行调试。写测试。编写不会与不必要的假设耦合的代码 - 例如您作为applet运行。不幸的是,大多数GUI / applet示例代码编写得非常糟糕。

答案 4 :(得分:1)

未捕获的异常将发送到控制台。您还可以使用System.out将自己的消息写入控制台。要查看结果,您需要通过右键单击系统托盘中的Java图标并打开控制台来打开控制台(请注意,这与Microsoft的VM不同)。

要正确调试applet,可以设置Eclipse来调试applet。右键单击applet源文件,然后单击Debug as Applet。 (如果您有applet的参数,则需要对其进行设置。)然后,您可以像调试任何其他Java代码一样逐步执行applet代码。

答案 5 :(得分:1)

我遇到了进行远程applet调试的问题,每次尝试从eclipse连接时,它抛出连接拒绝错误,我的jre版本是64位和eclipse 32位,当我用32位jre替换时,它工作了为了我。如果我们同时安装32位和64位jre版本,IE默认使用64位jre用于applet,chrome和FF可能使用32位jre版本。

答案 6 :(得分:1)

对我来说,在eclipse中获取applet调试最重要的动作,就是在java控制面板(tab java)中设置要使用的正确二进制文件,即具有调试符号。 只有jdk中包含的JRE才有此符号。 所以在java控制面板中调试applet,选项java,按下查看按钮,在jdk文件夹下找到正确的jre之后,对我来说例如“C:\ Programmi \ Java \ jdk1.7.0_03 \ jre”,并且只启用检查这个条目。 这对我来说是干净的方式来做Sami Koivu所说的。