Установка контрольных точек в Java

Как работает настройка контрольных точек в Java? Это только на основе имени исходного файла и номера строки? Имя класса или метода также отображается в?

Если у меня есть старая версия источника в моем отладчике и задана точка останова, курсор отключается при прохождении. Как далеко это может быть? Может ли он войти в неправильный метод (или даже неправильный класс, если в этом файле более одного класса)?

Что происходит, когда в JVM есть несколько классов с тем же именем (может случиться, если у вас более одного загрузчика классов)? Все ли они получают точку останова?

В контейнере веб-приложения можно установить точки останова только для одного веб-приложения (а не для других)?

Насколько это специфично IDE и сколько определяется интерфейсом отладки, который предоставляет JVM? Например: В Eclipse я могу установить условные точки останова на основе значений переменных. Это просто фильтрация, выполненная Eclipse на безусловной точке останова в JVM?

Ответы

Ответ 1

Существуют разные точки останова. Некоторые точки останова являются линейными, некоторые - нет. Как это влияет на вашу фактическую отладку, зависит от того, что на самом деле делает ваша IDE. Например, в Eclipse, если вы добавите точку останова в середине метода, это будет точка останова на основе строки. Если вы добавите точку останова в строке, содержащей подпись метода, это будет точка прерывания ввода метода.

Если исходный код, на который вы смотрите, не является точным источником запущенного класса, точка прерывания линии не будет отображаться на правильную линию, конечно. Таким образом, java не может остановиться на той линии, которую вы намеревались, и ваша IDE действительно может показать вам неправильный метод или даже неправильный класс. Но контрольная точка ввода метода будет по-прежнему работать (остановка в нужный момент), даже если строка, на которой был определен метод, изменилась; но снова IDE может показать неправильную строку в отладчике. (И есть и другие типы событий/точек останова, такие как загрузка классов,... Вы можете взглянуть на субинтерфейсы EventRequest если вы хотите узнать больше о внутренних компонентах).

Чтобы ответить на другой вопрос: точки останова применяются ко всем загрузчикам классов в JVM.

Ответ 2

JVM поддерживает стандартный API для отладки (см. Архитектура отладки Java-платформы), и все IDE используют JPDA для выполнения всех тяжелых снятие заданных контрольных точек, вычисление выражений и т.д. IDE "просто" завершают его в приятных пользовательских интерфейсах.

Когда вы устанавливаете точку останова, IDE разговаривает с интерфейсом инструмента JVM Tool (часть JDPA) и дает ему исходный файл и номер строки точки останова. JVM имеет информацию, необходимую ему для сопоставления физического местоположения точки останова с фактическим местоположением оператора Java в скомпилированном коде класса. Когда JVM достигает точки останова, он прекращает выполнение этого потока и сообщает IDE исходный файл точки останова и номер строки. Затем IDE отображает ваше местоположение.

Когда я отлаживаю, я иногда добавляю или удаляю строки для исправления проблемы, а затем перехожу к следующей проблеме. Но все становится странным, потому что точки останова теперь кажутся скорее или позже, чем я ожидал, и если бы я установил новые точки останова, они не были на исходной строке, на которой я их установил. Когда это произойдет, я перезапущу программу, а затем IDE и JVM будут снова согласованы.