java - 对 rt.jar 中的 java.lang.String 的微不足道的修改导致 VM 段错误

标签 java segmentation-fault

重现步骤:

  1. 对 JDK 的 src.zip 中的 java.lang.String 做一个简单的修改 比如添加

    private boolean dummy=false;

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

  3. 用新的 java/lang/String.class 更新 rt.jar
  4. 用更新版本替换 jre/lib 中的 rt.jar。
  5. 运行 bin/java 或任何使用 rt.jar 的实用程序

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 是不是有什么特别之处,意味着它不能被修改? (校验和等?)

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

谢谢,

克里斯

最佳答案

在此变更集之前: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 中运行,因为单个 boolean 值不会移动任何现有字段。无论哪种方式:使用最新的 JVM,一切都应该没问题。使用较旧的 JVM,可能会导致大量损坏。

关于java - 对 rt.jar 中的 java.lang.String 的微不足道的修改导致 VM 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23471222/

相关文章:

java - 如何在Tomcat 6中合理配置安全策略

高负载下的NGINX + PHP5-FPM段故障

Linux内核: sequence of events/paths before process coredump happens

c - getline()/strsep() 组合导致段错误

java - 图像没有在正确的时刻显示在屏幕上 - Java

java - 如何在java中从局域网获取现有用户名

java - Log4j2:如何说服它 log4j-core.jar 的类确实存在?

java - 如何在终端中运行打包的java文件?

c - 段错误 - 双向链表

c++ - 奇怪的段错误 - 将指针指向 vector 的对象推回导致崩溃