【问题标题】:How to diagnose an Invalid thread access SWTException?如何诊断无效的线程访问 SWTException?
【发布时间】:2009-02-04 13:22:08
【问题描述】:

我们正在为客户定制一个基于 Eclipse RCP 的工具。他们在他们的一台计算机上加载它时遇到了问题(它在其他计算机上工作)并提供了以下错误日志。

!会话 2009-01-23 12:09:05.593 ----------------------------------------------------------- eclipse.buildId =未知 java.version=1.5.0_12 java.vendor=Sun Microsystems Inc. 引导加载程序 常量:OS=win32,ARCH=x86, WS=win32, NL=en_GB 命令行 参数:-os win32 -ws win32 -arch x86

!ENTRY org.eclipse.osgi 4 0 2009-01-23 12:09:07.500 !MESSAGE 包 com.yantra.yfc.rcp.desktop.ri 不是 找到了。

!ENTRY org.eclipse.osgi 4 0 2009-01-23 12:09:11.906 !MESSAGE 应用程序 错误!堆栈 1 org.eclipse.swt.SWTException:无效 线程访问 org.eclipse.swt.SWT.error(SWT.java:3374) 在 org.eclipse.swt.SWT.error(SWT.java:3297) 在 org.eclipse.swt.SWT.error(SWT.java:3268) 在 org.eclipse.swt.widgets.Display.error(Display.java:978) 在 org.eclipse.swt.widgets.Display.checkDevice(Display.java:638) 在 org.eclipse.swt.graphics.Device.dispose(Device.java:261) 在 com.yantra.yfc.rcp.YRCApplication.run(YRCApplication.java:176) 在 org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:78) 在 org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:92) 在 org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:68) 在 org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400) 在 org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native 方法)在 sun.reflect.NativeMethodAccessorImpl.invoke(未知 来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知 来源)在 java.lang.reflect.Method.invoke(未知 来源)在 org.eclipse.core.launcher.Main.invokeFramework(Main.java:334) 在 org.eclipse.core.launcher.Main.basicRun(Main.java:278) 在 org.eclipse.core.launcher.Main.run(Main.java:973) 在 org.eclipse.core.launcher.Main.main(Main.java:948)

我已经用谷歌搜索了这个异常,但这似乎主要发生在人们尝试使用不同线程开发应用程序时。由于我们在任何其他计算机上都没有看到此问题,因此我不知道是什么原因造成的。

这一定是有问题的机器上的配置问题,因为代码来自供应商(因此可能经过良好测试)并且可以在我们测试过的所有其他机器上运行。

是否有人对这台计算机的问题背后有什么建议?或者关于可能揭示问题的调查路线的建议?

【问题讨论】:

    标签: java eclipse eclipse-rcp


    【解决方案1】:

    Eclipse 中只有一个 UI 线程。简而言之,规则是:

    • 如果您作为 UI 操作(例如事件处理程序、视图初始化)的一部分被调用,则您处于 UI 线程中。
    • 调用 UI 的所有其他操作(例如,需要显示对话框或向修改小部件的视图发送信息的作业) - 需要与 UI 线程同步。

    这基本上是这样完成的:

     Display.getDefault().syncExec( new Runnable() {  public void run() { } });
    

    您的代码进入 run 方法。您也可以使用 asyncExec 方法继续,而无需等待 UI 完成。

    尝试使用上面的 sn-p 来包装有问题的代码。

    编辑: 在 sn-p 中缺少 Runnable() 的结束括号。添加 sn-p 后工作正常。

    【讨论】:

    • 这不是我们的代码,因此调查线程实际上并不可行。此外,由于代码可以在其他所有机器上运行,因此我认为它更有可能是 JVM 或机器配置问题。
    • +1 因为它帮助了我,尽管我不知道它是否回答了 OP。
    【解决方案2】:

    在我看来,应用程序线程中抛出了异常,这只发生在某些机器上。可能 RCP 应用程序中有代码在 GUI 上显示异常并带有一些对话框,但这是在错误的线程中完成的。这可以解释为什么它只发生在某些机器上。它还可以解释为什么这个问题没有被发现......它可能永远不会在开发人员的计算机中发生,所以他们从不费心检查 UI 访问是否使用正确的线程完成。我曾经遇到过类似的问题。

    我的建议是仔细查看:

    com.yantra.yfc.rcp.YRCApplication.run(YRCApplication.java:176)

    由于代码是使用行号编译的,因此即使您没有源代码,也可以将调试器附加到该行,并尝试看看会发生什么。我很确定当你在有问题的机器上点击这个断点时,会抛出一个异常。那将是您的“真正”例外。

    【讨论】:

    • 同样的事情发生在我身上。在线程的 run() 方法中捕获了 Throwable 的所有实例,问题就消失了。
    【解决方案3】:

    【讨论】:

    • 我看到了 Eclipse 常见问题解答(Google 结果的第一页),但对于为什么这会发生在一个 Windows 框而不是我们所知道的任何其他框上,这并不是很有启发性。
    【解决方案4】:

    如果查看 YRCApplication 第 176 行的源代码没有帮助(为什么它在即将启动时调用 Display.dispose()?),我会将外部调试器附加到该特定机器上运行的进程。查看http://wiki.eclipse.org/Ninja#How_to_run_Eclipse_so_that_you_can_attach_an_external_debugger 获取说明;如果您尝试从远程计算机远程调试情况,您必须确保防火墙等没有阻止调试器使用的 TCP 连接。

    【讨论】:

      猜你喜欢
      • 2014-12-16
      • 2015-04-24
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多