gpt4 book ai didi

java - java中如何产生编译代码段错误?

转载 作者:行者123 更新时间:2023-12-03 03:36:57 25 4
gpt4 key购买 nike

我见过类似how-do-you-crash-a-jvm的问题和 shortest-code-that-raises-a-sigsegv
有一些 java 代码可以生成 SIGSEGV,例如:

final Constructor<Unsafe> unsafeConstructor = Unsafe.class.getDeclaredConstructor();
unsafeConstructor.setAccessible(true);
final Unsafe unsafe = unsafeConstructor.newInstance();
System.out.println(unsafe.getAddress(0));

它会产生一个SIGSEGV类型的V(VM帧)。

# JRE version: Java(TM) SE Runtime Environment (8.0_101-b13) (build 1.8.0_101-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.101-b13 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# V [jvm.dll+0x1e2440]

根据https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/crashes001.html编译代码崩溃

我想知道是否会产生类型化的 J 段错误。
我看到了一些库问题,例如 JVM crash .(那么说明可以手工制作?)

最佳答案

这是一个在编译代码中重现崩溃的程序。

import sun.misc.Unsafe;
import java.lang.reflect.Field;

public class Crash extends Thread {
static volatile Object obj = 0;

public static void main(String[] args) throws Exception {
new Crash().start();

// Give some time to compile run() method
Thread.sleep(2000);

Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);

// Overwrite Object's class field, so that 'instanceof' cannot work
unsafe.putInt(obj, 8L, -1);
}

public void run() {
while (!(obj instanceof Runnable)) {
// Loop until crash
}
}
}

它是如何工作的。 (或者说“它怎么不起作用”是正确的:)

  1. 运行一个无限循环的线程。这个循环显然是“热”的,因此该方法被 JIT 编译。
  2. instanceof 检查无法优化掉,因为 obj 是 volatile 的。
  3. 过了一段时间,我们通过向偏移量 #8 处的类字段写入垃圾来破坏 obj header 。
  4. 这会破坏已编译的代码,因为 instanceof 检查依赖于对象类。

这就是我们将得到的。

#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000000368b6ad, pid=9660, tid=0x00000000000032f0
#
# JRE version: Java(TM) SE Runtime Environment (8.0_192-b12) (build 1.8.0_192-b12)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.192-b12 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# J 38% C2 Crash.run()V (13 bytes) @ 0x000000000368b6ad [0x000000000368b640+0x6d]
#

关于java - java中如何产生编译代码段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53628690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com