【问题标题】:How to view everything running on the event thread如何查看在事件线程上运行的所有内容
【发布时间】:2011-04-18 17:58:04
【问题描述】:

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

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

【问题讨论】:

标签: java swing debugging awt event-dispatch-thread


【解决方案1】:

一种有趣的方法是扩展EventQueuepush() 它,如here 所示。

【讨论】:

  • 优秀。可悲的是,问题通常围绕在应该发布到EventQueue发布的内容,但该方法可能会提出新的线索。
【解决方案2】:

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

如果您仍希望记录事件调度线程正在执行的所有操作,您可以通过以下方式进行:

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

    System.out.println(arg0);
    return false;
    

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果您使用的是 Oracle JRE,则已包含 TracedEventQueue。你可以像之前提到的那样安装它:

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

      注意,这会输出 lot 的输出...

      【讨论】:

        猜你喜欢
        • 2012-02-21
        • 1970-01-01
        • 2012-06-02
        • 1970-01-01
        • 2023-02-16
        • 2011-12-23
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        相关资源
        最近更新 更多