对rt.jar中的java.lang.String进行简单修改,导致VM段错误

时间:2014-05-05 11:21:30

标签: java segmentation-fault

重现步骤:

  1. 从JDK的src.zip对java.lang.String进行一些简单的修改 比如添加

    private boolean dummy = false;

  2. 编译更改(Eclipse编译器)

  3. 使用新的java / lang / String.class
  4. 更新rt.jar
  5. 将jre / lib中的rt.jar替换为更新版本。
  6. 运行bin / java或任何使用rt.jar
  7. 的工具

    每次启动时,VM都会出现段错误。

    操作系统是Linux(Debian Wheezy)x86_64。适用于JDK 1.7.0_55和1.8.0_05

    #
    # A fatal error has been detected by the Java Runtime Environment:
    #
    #  SIGSEGV (0xb) at pc=0x0000000000000000, pid=13313, tid=140065468557056
    #
    # JRE version:  (7.0_55-b13) (build )
    # Java VM: Java HotSpot(TM) 64-Bit Server VM (24.55-b03 mixed mode linux-amd64 compressed oops)
    # Problematic frame:
    # C  0x0000000000000000
    #
    # Core dump written. Default location: /home/chris/workspace/JDK7/foo/core or core.13313
    #
    # If you would like to submit a bug report, please visit:
    #   http://bugreport.sun.com/bugreport/crash.jsp
    #
    
    ---------------  T H R E A D  ---------------
    
    Current thread (0x0000000000eb6000):  JavaThread "Unknown thread" [_thread_in_Java, id=13314, stack(0x00007f63886fa000,0x00007f63887fb000)]
    
    siginfo:si_signo=SIGSEGV: si_errno=0, si_code=1 (SEGV_MAPERR), si_addr=0x0000000000000000
    

    在gdb中加载核心转储提供:

    chris@nb:~/workspace/JDK7/foo$ gdb /home/chris/java/bin/java core
    GNU gdb (GDB) 7.4.1-debian
    Copyright (C) 2012 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-linux-gnu".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>...
    Reading symbols from /home/chris/jdk1.7.0_55/bin/java...(no debugging symbols     found)...done.
    
    warning: core file may not match specified executable file.
    [New LWP 13314]
    [New LWP 13315]
    [New LWP 13313]
    [New LWP 13316]
    [New LWP 13317]
    
    warning: Error reading shared library list entry at 0x302e6f732e646165
    
    warning: Error reading shared library list entry at 0x5f006f732e696c6a
    Core was generated by `jar cf rt.jar com java javax META-INF org sun sunw'.
    Program terminated with signal 6, Aborted.
    #0  0x00007f6387c6b475 in ?? ()
    (gdb) bt
    #0  0x00007f6387c6b475 in ?? ()
    #1  0x00007f6387c6e6f0 in ?? ()
    #2  0x0000000000000000 in ?? ()
    

    我以前用这种方式修改过其他VM类(早期的Java 7版本)没有问题。 java.lang.String有什么特别之处,这意味着它无法修改吗? (校验和等等?)

    这适用于个人基准测试实验,因此无需回复许可/分发问题。

    谢谢,

    克里斯

2 个答案:

答案 0 :(得分:5)

在此变更集之前:https://bugs.openjdk.java.net/browse/JDK-6924259 Hotspot对java.lang.String中各个字段的字段偏移进行了硬编码假设。这意味着如果向String类添加字段,导致类布局逻辑移动现有字段,则会破坏JVM。上面的更改集将JVM移动到运行时从真正的String类布局计算这些偏移量。相关错误显示了这个版本已被移植到的版本:https://bugs.openjdk.java.net/browse/JDK-6924259。我没有测试过任何东西,但我非常确定@ shipilev的例子在这个改变之前会在JVM中工作,因为单个布尔没有移动任何现有的字段。无论哪种方式:使用最近的JVM,一切都应该没问题。使用较旧的JVM可能会导致破坏。

答案 1 :(得分:2)

String在运行时经过大量优化,因此您可能会发现JVM无法处理对Java代码的更改。我会尝试在课程结束时添加最好的工作机会。

例如,您可以向Object添加一个方法,但添加两个方法,即使没有转储,JVM也可能崩溃。