Браузер Equo Chromium для Java/SWT аварийно завершает работу в UbuntuJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Браузер Equo Chromium для Java/SWT аварийно завершает работу в Ubuntu

Сообщение Anonymous »

У меня есть программа Java/SWT, и я использую стандартный виджет браузера, входящий в состав библиотеки SWT. Из-за его недостатков (подробнее об этом, если вам интересно), я подумываю о переходе на Equo Chromium Community Edition, что кажется заманчивой альтернативой (ссылка здесь).
Однако я могу даже не воспроизвожу пример кода, который есть на github, без сбоя JVM.
Подводя итог: Я использую Ubuntu Gnome 22.04 с openJdk 17.0.1+ 12, SWT 4.3, и сбой происходит вне JVM в собственном коде. Проблемный фрейм — [libc.so.6+0x97ef4] pthread_mutex_lock+0x4
Подробнее, вот мой код, взятый и упрощенный из примера, найденного на github (ссылка здесь)

Код: Выделить всё

 package com.testmaven.test.equo;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import com.equo.chromium.ChromiumBrowser;
import com.equo.chromium.swt.Browser;

public class SampleSWT {
private static final String URL = "https://docs.equo.dev/main/getting-started/introduction.html";

public static void main(String[] args) throws ClassNotFoundException {

ChromiumBrowser.earlyInit();
Display display = Display.getDefault();

Shell shell = new Shell(display);
shell.setSize(300, 300);
shell.setLayout(new GridLayout(1, false));
shell.setText("Bug report");

System.setProperty("chromium.debug", "true");
ChromiumBrowser.earlyInit();

Browser browser = new Browser(shell, SWT.NONE);
browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
browser.setUrl(URL);
Button button = new Button(shell, SWT.PUSH);
//button.setText("Hello");
//button.pack();
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
browser.execute(
"alert('hello')");
System.out.println("\nbutton clicked");
}
});

shell.open();

while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
}

Вот соответствующая часть моего файла pom.xml:

Код: Выделить всё

      

Equo-Chromium
https://dl.equo.dev/chromium-swt-ce/oss/mvn




org.eclipse.swt
org.eclipse.swt.gtk.linux.x86_64
4.3
provided


commons-io
commons-io
2.17.0


com.equo
com.equo.chromium
124.0.0


com.equo
com.equo.chromium.cef.gtk.linux.x86_64
124.0.0




Ожидаемое поведение:
  • пользовательский интерфейс не должен давать сбой
  • при нажатии на кнопку должно появиться окно «Привет» из JavaScript.
Фактическое поведение:
  • Пользовательский интерфейс аварийно завершает работу при запуске со следующим выводом

Код: Выделить всё

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fef42a97ef4, pid=57972, tid=57977
#
# JRE version: OpenJDK Runtime Environment Temurin-17.0.1+12 (17.0.1+12) (build 17.0.1+12)
# Java VM: OpenJDK 64-Bit Server VM Temurin-17.0.1+12 (17.0.1+12, mixed mode, tiered, > compressed oops, compressed class ptrs, g1 gc, linux-amd64)
# Problematic frame:
# C  [libc.so.6+0x97ef4]  pthread_mutex_lock+0x4
#
# Core dump will be written.  Default location: Core dumps may be processed with "/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E" (or dumping to /media/guillaume/Docs_cabine/Source/TestMaven/test.equo/core.57972)
#
# If you would like to submit a bug report, please visit:
#   https://github.com/adoptium/adoptium-support/issues
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

---------------  S U M M A R Y ------------

Command Line: -Dfile.encoding=UTF-8 -XX:+ShowCodeDetailsInExceptionMessages > com.testmaven.test.equo.SampleSWT

Host: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz, 8 cores, 7G, Ubuntu 22.04.5 LTS
Time: Wed Oct  2 16:04:17 2024 CEST elapsed time: 6.717892 seconds (0d 0h 0m 6s)

---------------  T H R E A D  ---------------

Current thread (0x00007fef3c0248b0):  JavaThread "main" [_thread_in_native, id=57977, > stack(0x00007fef42900000,0x00007fef42a00000)]

Stack: [0x00007fef42900000,0x00007fef42a00000],  sp=0x00007fef429fa3b8,  free space=1000k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [libc.so.6+0x97ef4]  pthread_mutex_lock+0x4

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 822  org.eclipse.swt.internal.gtk.GTK._gtk_main_do_event(J)V (0 bytes) @ > 0x00007fef31306ce1 [0x00007fef31306ca0+0x0000000000000041]
J 814 c1 org.eclipse.swt.widgets.Display.eventProc(JJ)J (185 bytes) @ 0x00007fef29ef8584 > [0x00007fef29ef80c0+0x00000000000004c4]
v  ~StubRoutines::call_stub
j  org.eclipse.swt.internal.gtk.GTK._gtk_dialog_run(J)I+0
j  org.eclipse.swt.internal.gtk.GTK.gtk_dialog_run(J)I+8
j  org.eclipse.swt.widgets.MessageBox.open()I+312
j  com.equo.chromium.swt.internal.Chromium.lambda$24(Lorg/cef/handler/CefJSDialogHandler$JSDialogType;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/function/Consumer;)V+183
j  com.equo.chromium.swt.internal.Chromium$$Lambda$49+0x0000000100124f50.run()V+28
j  org.eclipse.swt.widgets.RunnableLock.run(Lorg/eclipse/swt/widgets/Display;)V+11
J 745 c1 org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Z)Z (192 bytes) @ 0x00007fef29ee00f4 [0x00007fef29edff60+0x0000000000000194]
J 720 c1 org.eclipse.swt.widgets.Display.readAndDispatch()Z (79 bytes) @ 0x00007fef29ed40d4 [0x00007fef29ed3ce0+0x00000000000003f4]
j  com.testmaven.test.equo.SampleSWT.main([Ljava/lang/String;)V+121
v  ~StubRoutines::call_stub

siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x0000000000000010

Register to memory mapping:
Что я пробовал:
  • Закомментирование следующих двух строк предотвратит Пользовательский интерфейс не вылетает при запуске

Код: Выделить всё

//button.setText("hello")
//button.pack();
В этом случае виджет браузера загрузит URL-адрес, как ожидалось. Однако нажатие на кнопку приведет к сбою пользовательского интерфейса с тем же выводом в консоли. Однако обратите внимание, что я слышу «хлопающий» шум, связанный с функцией javascript «alert()» прямо перед ее сбоем, и System.println(»нажатие кнопки») работает, как показано в следующем выводе:

Код: Выделить всё

button clicked
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fef42a97ef4, pid=57972, tid=57977
  • При запуске нескольких тестов поведение не всегда единообразно. Выход из сеанса Gnome и повторный вход заставят систему снова вести себя так, как я описал выше.
  • Я пробовал другие версии Ubuntu и протестировал тот же код с помощью Wayland вместо Xorg, даже попробовал Unity вместо Gnome, с теми же результатами.
  • Погуглил "проблемный фрейм" [libc.so.6+0x97ef4] pthread_mutex_lock+0x4" действительно возвращает несколько результатов, но в каждом случае либо не нашли убедительного решения, либо оно выше моего уровня знаний и понимания.
Вопросы
Есть ли у кого-нибудь опыт использования Equo Chromium с SWT в Ubuntu?
Из того, что я могу понять, сбой, похоже, связан с определенными вещами, происходящими в пользовательском интерфейсе, что заставляет меня думать о проблеме с многопоточностью. Считаете ли вы, что это следует рассматривать как ошибку в equo.chromium.cef.gtk.linux.x86_64?

Подробнее здесь: https://stackoverflow.com/questions/790 ... -on-ubuntu
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»