Отладка скриптов Groovy, работающих в ScriptEngine из Eclipse

У меня есть сценарий Groovy, который запускается следующим образом:

File scriptFile = ...;
ScriptEngine engine = ...;
String script = FileUtils.readFileToString(scriptFile);
Object evalResult = engine.eval(script, bindings);

Неудивительно, что точка останова, установленная в файле скрипта, не срабатывает. Что я могу изменить, чтобы заставить его работать? Сценарий необходимо запускать в контексте более крупной программы (без отдельной конфигурации запуска) и через ScriptEngine, а файл известен только во время выполнения.


person Alexey Romanov    schedule 01.08.2012    source источник


Ответы (2)


Я использую этот хак: я определил класс Java Debugger, который выглядит так:

public class Debugger {

    private static final Logger log = LoggerFactory.getLogger( Debugger.class );

    /**
     * Invoke this method anywhere to end up in the Java debugger.
     * 
     * <p>Sometimes, you have code that might eventually be executed or you have a place
     * where you want to stop but no code line.
     * 
     * <p>In these case, use this method.
     * 
     * <p>Don't forget to set a breakpoint, first :-)
     * */
    public static void stopInDebugger() {
        log.error( "Please set a breakpoint in Debugger.stopInDebugger() and try again whatever you just did!" );
    }
}

У меня есть точка останова в строке log.error в Ecipse.

Теперь я могу поместить эту строку в скрипт, где мне нужна точка останова:

Debugger.stopInDebugger();

Конечно, это не позволяет мне легко пройтись по сценарию, но это лучше, чем ничего.

person Aaron Digulla    schedule 07.05.2014
comment
Отладчик остановится на log.error(... в классе отладчика. Он показывает только переменные класса отладчика. Как вы можете получить переменные из сценария для оценки в этом или просмотреть переменные, связанные со сценарием, и т. д.? - person AhmedRana; 29.01.2019
comment
@AhmedRana Groovy создаст объекты класса Java из вашего скрипта. Просто поднимитесь по стеку. Переменные будут либо локальными переменными в кадре стека вашего класса скрипта, либо полями этого класса. - person Aaron Digulla; 29.01.2019
comment
Большое спасибо :) Работал с groovy Не знаете, можно ли заставить это работать и с jython? - person AhmedRana; 30.01.2019
comment
Никогда не использовал jython, но посмотрите jython.org/docs/library/debug.html< /а> - person Aaron Digulla; 30.01.2019

Ваш файл сценария находится в исходной папке на пути к классам (похоже, что это не так)? Если нет, то сделайте так. Вы также можете изменить свои настройки, чтобы файл скрипта никогда не компилировался компилятором (и, при желании, даже не копировался в выходную папку). Перейдите в «Настройки» -> «Groovy» -> «Компилятор» и просмотрите папки сценариев, чтобы это произошло.

person Andrew Eisenberg    schedule 02.08.2012
comment
В моем случае в скрипте отсутствовала строка package. Я предпочитаю ваш пост в этом вопросе: stackoverflow.com/questions/4833213/ - person Vince; 15.02.2013