在Oracle Jre上,GtkLookAndFeel致命崩溃

8

我遇到一个问题,每当我检查是否支持GtkLookAndFeel时,JRE就会崩溃。令人惊讶的是,这个bug似乎只在Oracle JRE上出现。

到目前为止,我已经在三个JRE上测试了此行为:

(我使用了所有这些的64位版本)

  • OpenJDK Runtime Environment (IcedTea 2.5.1) (7u65-2.5.1-4) -> 运行正常
  • Java(TM) SE Runtime Environment (build 1.7.0_67-b01) -> 崩溃
  • Java(TM) SE Runtime Environment (build 1.8.0_20-b26) -> 崩溃

以下是触发此错误的代码:

import javax.swing.LookAndFeel;
public class Test
{
    public static void main(String[] args)
    {
      LookAndFeel currLAF = new com.sun.java.swing.plaf.gtk.GTKLookAndFeel();
      currLAF.isSupportedLookAndFeel();
      System.out.println("I am exiting main");
    } 
}

以下是输出结果:
I am exiting main
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f91fe0fdbe0, pid=332, tid=140265730119424
#
# JRE version: Java(TM) SE Runtime Environment (7.0_67-b01) (build 1.7.0_67-b01)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.65-b04 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  0x00007f91fe0fdbe0
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/ethan/fail/hs_err_pid332.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
#

请注意,程序仅在退出主函数后崩溃。
供参考,我正在一台64位debian测试机上进行开发,并已验证其他GTK+应用程序可正常工作。
我应该向Oracle报告此问题还是我做错了什么?

在我看来那肯定是一个 bug,你可以继续提交 Java 8 故障报告(包括相关的 'hs_err_pid....log' 文件,并可能启用核心转储)。 - dimo414
1个回答

1
我会向Oracle提交一个错误报告。我记得很多年前发生过类似的事情。您已经尽了职责,在多个运行时环境上进行了测试,并确定了错误出现的位置(至少在较高级别上)。我建议您告诉他们您所做的一切,如此处所列,并为了安全起见,如果可以,请在几台不同的机器上运行相同的代码。我知道Java应该以相同的方式运行,因为它是这样设计的,但仍建议这样做,以便在错误报告中说明您已经这样做了。
请确保按照以下指南收集正确的信息、崩溃转储、系统信息、运行时信息等:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/bugreports.html

如果可能的话,请获取核心转储。 对于调试实际发生情况,核心转储将非常有帮助(几乎是必须的)。这是 Oracle 页面的链接,但您可能需要找到适用于您机器的特定信息: https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/bugreports004.html#CHDJJAJE

从上面的链接中:

在 Linux 操作系统中,未处理的信号(例如段错误、非法指令等)会导致核心转储。默认情况下,核心转储创建在进程的当前工作目录中,并以 core.pid 命名,其中 pid 是崩溃的 Java 进程的进程 ID。

ulimit 实用程序用于获取或设置可用于当前 shell 及其后代的系统资源的限制。使用 ulimit -c 命令检查或设置核心文件大小限制。确保将限制设置为无限制,否则核心文件可能会被截断。

这是Java Oracle Bug Reporting Site的链接:https://bugreport.java.com/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接