Что было бы наилучшим способом инструментария классов Java для создания обратного отладчика Java?
Я хотел бы создать обратный отладчик (отладчик, в котором можно вернуться к выполнению программы) для Java, и для этого мне нужно хранить переменные данные вместе с выполнением программы. Я буду использовать для этого глобальный кеш и статический метод, который обновляет кеш.
Я хотел бы оснастить загруженные классы таким образом, чтобы после каждого изменения поля / переменной вызывал мой статический метод: например:
public static void updateCache(String fullVarName, Object value){...}
Я заметил, что при обновлении поля putfield
инструкция выполнена. Когда локальная переменная обновляется,(I)STORE
инструкция используется. Поэтому я подумал об инструментировании классов, и всякий раз, когда обнаруживается такой код операции, я просто вставляю другойgetfield
или ILOAD
после, чтобы получить значение обновленного поля / переменной, а затем я использую invokestatic
вызвать мой статический метод со всей необходимой информацией.
Проблема в том, что есть и другие варианты использования, когда переменные представляют собой коллекции или массивы, и они обновляются с помощью определенных методов, например, при обновлении HashMap
с map.put(key, value)
. Так что мне нужно перехватывать и эти вызовы, но таких методов много, и мне нужно найти и жестко запрограммировать их все...
Есть ли обходной путь? А может, мне чего-то не хватает, и есть более простое решение.
Изменить: я также раньше изучал JVMTI и запускал несколько тестов. Казалось, что это слишком медленно для моего случая использования, например, добавляет к моей программе замедление в 7-100 раз...
1 ответ
Если ваша цель - получить только возможность обратной отладки, вы можете попробовать Jive ( https://cse.buffalo.edu/jive/). Его можно использовать вместе с Eclipse.
Но если ваша цель - самостоятельно создать инструмент обратной отладки, эта статья может вам помочь: https://www.researchgate.net/publication/220093333_Back_to_the_Future_Omniscient_Debugging