2

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

!会话 2009-01-23 12:09:05.593 -------------------------------------------------- --------- eclipse.buildId=unknown java.version=1.5.0_12 java.vendor=Sun Microsystems Inc. BootLoader 常量: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 Bundle com.yantra.yfc.rcp.desktop.ri 未找到。

!ENTRY org.eclipse.osgi 4 0 2009-01-23 12:09:11.906 !MESSAGE 应用程序错误!STACK 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。开始(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 Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 在 java.lang.reflect.Method.invoke(Unknown Source)在 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)core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown源)在 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)core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown源)在 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)在 org.eclipse.core.launcher.Main.invokeFramework(Main.java:334) 在 org.eclipse.core.launcher.Main.basicRun 的 java.lang.reflect.Method.invoke(Unknown Source) 调用(Unknown Source) (Main.java:278) 在 org.eclipse.core.launcher.Main.run(Main.java:973) 在 org.eclipse.core.launcher.Main.main(Main.java:948)在 org.eclipse.core.launcher.Main.invokeFramework(Main.java:334) 在 org.eclipse.core.launcher.Main.basicRun 的 java.lang.reflect.Method.invoke(Unknown Source) 调用(Unknown Source) (Main.java:278) 在 org.eclipse.core.launcher.Main.run(Main.java:973) 在 org.eclipse.core.launcher.Main.main(Main.java:948)

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

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

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

4

4 回答 4

11

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

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

这基本上是这样完成的:

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

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

尝试使用上面的代码片段来包装有问题的代码。

编辑:片段中缺少 Runnable() 的结束括号。添加片段后工作正常。

于 2009-02-04T18:30:49.167 回答
2

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

我的建议是仔细研究:

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

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

于 2009-02-05T12:00:38.313 回答
1

您还可以在The Official Eclipse FAQs中找到答案,特别是:为什么我得到一个无效的线程访问异常?

于 2009-02-04T18:40:52.437 回答
0

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

于 2009-02-09T02:06:57.990 回答