Как да диагностицирам SWTException за невалиден достъп до нишка?

Ние персонализираме базиран на Eclipse RCP инструмент за клиент. Имат проблеми със зареждането на един от компютрите си (работи на други) и са предоставили следния регистър на грешките.

!СЕСИЯ 2009-01-23 12:09:05.593 ------------------------------------- --------- eclipse.buildId=неизвестен 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 Пакетът 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.start(EclipseAppLauncher.java:68) в org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java :400) в org.eclipse.core.runti me.adaptor.EclipseStarter.run(EclipseStarter.java:177) в sun.reflect.NativeMethodAccessorImpl.invoke0(Нативен метод) в 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)

Търсих в Google изключението, но това изглежда се случва най-вече, когато хората се опитват да разработят приложения, използвайки различни нишки. Тъй като не виждаме този проблем на никой друг компютър, не знам какво може да го причинява.

Трябва да е проблем с конфигурацията на въпросната машина, тъй като кодът е от доставчика (така че вероятно е добре тестван) и работи на всяка друга машина, на която сме го тествали.

Някой има ли някакви предложения за това какво може да се крие зад проблема за този компютър? Или предложения за линии на разследване, които биха могли да разкрият проблема?


person Caoilte    schedule 04.02.2009    source източник


Отговори (4)


Струва ми се, че в нишката на приложението се хвърля изключение, което се случва само на някои машини. Вероятно има код в приложението RCP за показване на изключението в GUI с някакъв диалогов прозорец, но това се прави в грешната нишка. Това би обяснило защо се случва само на някои машини. Това също би обяснило защо проблемът е останал незабелязан.... вероятно никога не се случва в компютрите на разработчиците, така че те никога не са си направили труда да проверят дали достъпът до потребителския интерфейс се извършва с правилната нишка. Веднъж имах подобен проблем.

Моето предложение е да разгледате внимателно:

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

Тъй като кодът е компилиран с номера на редове, можете да прикачите програма за отстраняване на грешки към този ред, дори ако нямате изходен код, и опитайте да видите какво ще се случи. Почти съм сигурен, че когато достигнете тази точка на прекъсване на проблемната машина, ще бъде хвърлено изключение. Това ще бъде вашето "Истинско" изключение.

person Mario Ortegón    schedule 05.02.2009
comment
Същото нещо се случи и с мен. Хванах всички екземпляри на Throwable в метода run() на нишката и проблемът изчезна. - person Thomas; 04.06.2009

Има само една UI нишка в Eclipse. С две думи правилата са:

  • Ако сте били извикани като част от UI операция (напр. манипулатор на събития, инициализация на изглед), вие сте в нишката на UI.
  • Всички други операции, които извикват потребителски интерфейс (напр. задание, което трябва да покаже диалог или да изпрати информация до изглед, който модифицира изпълним модул) - трябва да се синхронизират с нишката на потребителския интерфейс.

Това основно се прави по следния начин:

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

Вашият код влиза в метода run. Можете също да използвате метода asyncExec, за да продължите, без да чакате потребителският интерфейс да приключи.

Опитайте да използвате горния фрагмент, за да обвиете проблемния код.

РЕДАКТИРАНЕ: Крайна скоба за Runnable() липсваше във фрагмента. След добавяне на фрагмент работи добре.

person zvikico    schedule 04.02.2009
comment
Това не е нашият код, така че разследването на нишки не е наистина осъществимо. Също така, тъй като кодът работи на всяка друга машина, това прави да изглежда по-вероятно, че това е JVM или проблем с конфигурацията на машината, бих си помислил. - person Caoilte; 05.02.2009
comment
+1, защото ми помогна, въпреки че не знам дали отговори на OP. - person rds; 24.11.2011

Можете също да намерите отговора в Официалните ЧЗВ за Eclipse, по-специално: Защо получавам изключение за невалиден достъп до нишка?

person Fabian Steeg    schedule 04.02.2009
comment
Видях често задаваните въпроси за Eclipse (1-ва страница в резултатите от Google), но не беше много поучително защо това ще се случи на една кутия на Windows, а не на друга, за която знаем. - person Caoilte; 05.02.2009

Ако разглеждането на изходния код за ред 176 на YRCApplication не помогне (защо извиква Display.dispose(), когато е на път да започне?), бих прикрепил външен дебъгер към процеса, изпълняван на тази конкретна машина. Разгледайте http://wiki.eclipse.org/Ninja#How_to_run_Eclipse_so_that_you_can_attach_an_external_debugger за инструкции; ако се опитате да дебъгвате ситуацията дистанционно от отдалечена машина, ще трябва да се уверите, че защитните стени и т.н. не блокират TCP връзката, използвана от дебъгера.

person Boris Bokowski    schedule 09.02.2009