2011-12-21 3 views
3

Когда я нажимаю точку останова в коде выполнения java, что она на самом деле делает?Что такое точка останова для JVM/байт-кода/процессора?

Это флаг на уровне JVM? На уровне процессора?

Можем ли мы видеть разницу в инструкциях по байт-коду? Это цикл в JVM?

ответ

3

Я не нашел конкретных ссылок на установку контрольных точек в Java, но в собственном коде отладчик поместил одну командную инструкцию прерывания (INT 3) поверх оригинальной инструкции. Как только достигнуто, прерывание срабатывает и дает управление отладчику. This article имеет дополнительную информацию.

От JVM Tools documentation Я бы сделал вывод, что аналогичный подход используется в байт-коде Java.

+0

Я прочитал статью, и я нашел ее действительно интересной. Но я все еще не могу понять все: в статье они сохраняют в памяти значение выбранного значения точки останова. Затем измените значение в выбранном смещении точки останова на байт-код, указывающий OxCA. Кажется, этот момент просто спит. Следует поэтому учитывать, что код уже полностью загружен в стек JVM перед выполнением. И изменение точки байт-кода просто изменит порядок процесса? Не нужно перекомпилировать каждый раз при изменении чего-то? –

+0

Вы не меняете исходный код, а только байт-код в памяти, который уже является продуктом компиляции. JVM говорит байт-код и ничего не знает о компиляции. Javac - это переводчик из Java-кода, созданного человеком, в байт-код JVM. Любая отладка будет происходить в контексте отладчика. Отладчик сообщит JVM о том, что он заменил код и поставил прерывание (0xCA) на свое место. JVM полностью знает, где в памяти сидит этот байт-код, поэтому нет проблем с его заменой. –

+0

И знаете ли вы, как сообщить JVM вспомнить замененный код и поставить точку останова OxCA? –

1

Зависит от реализации. Для кода JITCed (и, например, регулярного C/C++) некоторые поля перезаписывают инструкцию с помощью команды trap, в то время как другие используют «аппаратные средства» (как правило, связанные с защитой хранилища), чтобы обнаружить попадание точки останова.

Аналогичным образом, в интерпретируемых байт-кодах он может быть либо измененным байт-кодом (для него зарезервирована кодовая точка байта 0xCA), либо с помощью логики сравнения адресов, встроенной в интерпретатор.

+0

Точка OxCA заставляет текущий поток приостановить выполнение в течение определенного периода времени? Это просто функция сна? –

+0

0xCA зарезервирован для выполнения того, что хочет JVM. Однако, если вы вставляете его в файл .class, скорее всего, он будет объявлен как незаконный код операции. –

Смежные вопросы