Как произвести ошибку сегментации скомпилированного кода в Java? - PullRequest
0 голосов
/ 05 декабря 2018

Я видел вопрос типа how-do-you-crash-a-jvm и самый короткий код, который поднимает-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]

И есть Crash in Compiled Code в соответствии с https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/crashes001.html.

Интересно, есть ли в любом случае, чтобы вызвать напечатанный J ошибка сегментации.
И у меня естьвидел какую-то проблему с библиотекой, например сбой JVM . (значит, это может быть сделано вручную?)

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Вот программа, которая воспроизводит сбой в скомпилированном коде.

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 является изменчивым.
  3. Через некоторое время мы испортим *Заголовок 1015 * путем записи мусора в его поле класса со смещением № 8.
  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]
#
0 голосов
/ 05 декабря 2018

Когда JVM падает таким образом, он показывает фактическую трассировку стека после встраивания.Это означает, что методы, которые были встроены, не отображаются.

Что вы можете сделать, это запустить тест, в котором этот код нагревается до точки, в которой встроен небезопасный код, то вы можете вызвать сбой, которыйоднако, я пришел из метода Java, но настоящая причина была указана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...