Установка точек останова в Java - PullRequest
16 голосов
/ 13 мая 2009

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

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

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

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

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

Ответы [ 2 ]

14 голосов
/ 13 мая 2009

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

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

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

6 голосов
/ 14 мая 2009

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

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

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

...