2009-05-13 4 views
15

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

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

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

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

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

+0

Я действительно думаю, что вам нужно быть более IDE конкретным здесь. –

+0

Не все IDE используют тот же интерфейс отладчика, который предоставляет JVM? – Thilo

ответ

13

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

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

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

6

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

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

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

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