4

我们遇到了一个我们无法追踪的错误,我们无法追踪某些东西冻结了我们的 Swing 线程(现在已经快 2 周了,还没有真正的结果)——我们是经验丰富的 Swing 程序员,但我们有一个庞大的程序,并且相信它存在于一些遗留代码

我想知道,除了EventQueue在 JDK 中编辑实际类之外,还有什么方法可以让我们查看当前在 Event Dispatch Thread 上运行的所有代码片段——也许是某种工具可以让我们查看它们进入或离开事件派发线程?

4

4 回答 4

5

一种有趣的方法是扩展它EventQueue,如此push()所示。

于 2011-04-18T18:39:40.760 回答
4

记录通过事件调度线程的所有内容似乎是诊断冻结的一种繁琐方法。等到问题出现,然后询问事件调度线程现在在做什么不是更容易?一种方法是启用 JMX 监控,使用诸如VisualVM (JDK 附带)之类的 JMX 客户端连接到正在运行的进程,等待问题发生,然后进行线程转储

如果您仍然希望记录 Event Dispatch Thread 正在执行的所有操作,您可以通过以下方式执行此操作:

  1. 在 Eclipse 中,以调试模式启动应用程序。
  2. 在 上创建断点EventQueue.dispatchEvent,右键,选择“属性”,勾选“条件”,输入以下“条件”:

    System.out.println(arg0);
    return false;
    
于 2011-04-18T18:39:06.943 回答
2

尝试BTrace检测 EventQueue 并在每次添加某些内容时捕获堆栈跟踪可能是个好主意。我认为最新的 VisualVM 具有允许您使用 BTrace 脚本检测正在运行的 JVM 的插件。

于 2011-04-18T18:18:13.537 回答
0

如果您使用的是 Oracle JRE,则已经包含一个TracedEventQueue。您可以如前所述安装它:

EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.push(new TracedEventQueue());

注意,这会输出很多输出...

于 2013-12-17T16:33:15.917 回答