Подтвердить что ты не робот

Функция Drop to frame отключена в Eclipse Debug при запуске тестовых систем с использованием JUnit

Окружающая среда: Linux, Eclipse Juno, Java 7, JUnit

Когда в режиме отладки запускается простое приложение (класс java с основным методом), функция "Drop to Frame" отлично работает в Eclipse. Однако, если тот же метод вызывается из тестового примера junit, функция "Drop to Frame" отключена в Eclipse. Из документации

Примечание. Эта команда доступна только в том случае, если текущая виртуальная машина поддерживает кадр, а выбранная структура стека не является верхним фреймом или кадром в собственный метод.

Как видно из фреймов стека в окне Debug, когда запускается тестовый пример junit, есть кадр "NativeMethodAccessorImpl.invoke", который является родным. Я предполагаю, что это причина, по которой "Drop to Frame" отключен.

Сообщите мне, правильны ли эти рассуждения, и если да, для устранения этого могут возникнуть какие-либо обходные пути.

4b9b3361

Ответ 1

Я использую Eclipse Luna, Java 7 под Windows. Ситуация остается такой же, как описано: "Drop to frame" отключен для тестового метода, который сразу же следует за рамкой "NativeMethodAccessorImpl.invoke". Отключенное состояние "Drop to frame" привязано к методу canDropToFrame() Соответствующий supportsDropToFrame() в классе org.eclipse.jdt.internal.debug.core.model.JDIStackFrame, (в моем распределении) часть plugins/org.eclipse.jdt.debug_3.8.102.v20150115-1323/jdimodel.jar. Метод поддерживаетDropToFrame() проверяет, может ли определенный кадр быть удален, и тесты

  • JVM должен поддерживать сброс кадров
  • рамка не должна быть самой верхней частью кадра
  • кадр не должен быть родным
  • предыдущий кадр не должен

Итак, предположение Рамеша было правильным. Это исходный фрагмент кода для тестов 3 + 4:

int index = 0;
JDIStackFrame frame = null;
while (index < frames.size()) {
    frame = (JDIStackFrame) frames.get(index);
    index++;
    if (frame.isNative()) {
        return false;
    }
    if (frame.equals(this)) {
        if (jdkSupport) {
            // JDK 1.4 VMs are currently unable to pop the
            // frame directly above a native frame
            if (index < frames.size()
                    && ((JDIStackFrame) frames.get(index))
                            .isNative()) {
                return false;
            }
        }
        return true;
    }
}

В комментарии говорится, что он был написан в JDK в 1,4 раза, поэтому, возможно, в то же время JVM теперь может также отбрасывать кадры над собственными кадрами.

Я создал исправленную версию JDIStackFrame, которая пропускает тест 4. Теперь, когда вы остановились на методе теста Junit, функция "Drop to frame" была включена, как и ожидалось.

Но при фактическом снижении фрейма я получил окно с сообщением об ошибке, в котором указано "com.sun.jdi.InternalException: Получил код ошибки в ответ: 32 произошел всплывающий стек стека".

Я предполагаю, что это код ошибки JDWP. Поэтому кажется, что такой "Drop to frame" не работает в JDK 1.7 (не знаю об 1,8), и это не вещь Eclipse.