适用于 Java/SWT 的 Equo Chromium 浏览器在 Ubuntu 上崩溃

问题描述 投票:0回答:1

我有一个 Java/SWT 程序,并且我正在使用 SWT 库附带的标准浏览器小部件。由于它的缺点(如果您感兴趣,请详细了解),我正在考虑切换到 Equo Chromium 社区版,这似乎是一个诱人的替代方案(链接此处)。

但是,我什至无法重现他们在 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 文件的相关部分:

      <repositories>
    <repository>
        <id>Equo-Chromium</id>
        <url>https://dl.equo.dev/chromium-swt-ce/oss/mvn</url>
    </repository>
</repositories>

<dependency>
    <groupId>org.eclipse.swt</groupId>
    <artifactId>org.eclipse.swt.gtk.linux.x86_64</artifactId>
    <version>4.3</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.17.0</version>
</dependency>
<dependency>
    <groupId>com.equo</groupId>
    <artifactId>com.equo.chromium</artifactId>
    <version>124.0.0</version>
</dependency>
<dependency>
    <groupId>com.equo</groupId>
    <artifactId>com.equo.chromium.cef.gtk.linux.x86_64</artifactId>
    <version>124.0.0</version>
</dependency>

  </dependencies>
  

预期行为:

  • 用户界面不应崩溃
  • 点击按钮应该会从 javascript 中弹出一个“hello”窗口

实际行为:

  • UI 在启动时崩溃并显示以下输出
#
# 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:

我尝试过的:

  1. 注释掉以下两行将防止 UI 在启动时崩溃
//button.setText("hello")
//button.pack();

在这种情况下,浏览器小部件将按预期加载 URL。但是,单击该按钮将使 UI 崩溃,并在控制台中显示相同的输出。但请注意,我可以在 javascript 'alert()' 函数崩溃之前听到与它相关的“扑通”噪音,并且 System.println("button clicked") 确实有效,如以下输出所示:

button clicked
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fef42a97ef4, pid=57972, tid=57977
  1. 运行多个测试时,行为并不总是一致。注销我的 Gnome 会话并再次登录将使系统再次像我上面描述的那样运行。

  2. 我尝试过其他版本的 Ubuntu,并使用 Wayland 而不是 Xorg 测试了相同的代码,甚至尝试了 Unity 而不是 Gnome,结果相同。

  3. 谷歌搜索“有问题的框架[libc.so.6 + 0x97ef4] pthread_mutex_lock + 0x4”确实返回了几个结果,但在每种情况下,他们要么没有找到令人信服的解决方案,要么超出了我的知识水平理解。

问题

有人有在 Ubuntu 上使用 Equo Chromium 和 SWT 的经验吗? 据我所知,崩溃似乎与 UI 中发生的某些事情有关,这让我想到了线程问题。您认为这应该被视为 equo.chromium.cef.gtk.linux.x86_64 中的错误吗?

java eclipse swt chromium-embedded
1个回答
0
投票

我是 Equo Chromium 的开发者之一。您的应用程序似乎缺少

-Dchromium.init_threads=true
属性,由于 Xlib+GTK 中的错误,该属性在某些 Linux 系统上是必需的。我们的示例应用程序确实包含此属性。

此外,仅供参考,只有在创建应用程序中的第一个浏览器之前调用

ChromiumBrowser.earlyInit()
才会产生效果。浏览器初始化后,再次调用不会有任何影响。

© www.soinside.com 2019 - 2024. All rights reserved.