Как установить точку останова в Eclipse в сторонней библиотеке?

Я получаю исключение NullPointerException в классе из сторонней библиотеки. Теперь я хотел бы отладить все это, и мне нужно было бы знать, из какого объекта хранится класс. Но мне кажется, что я не могу установить точку останова в классе от третьей стороны.

Кто-нибудь знает выход из моей беды? Конечно, я использую Eclipse в качестве своей IDE.

Обновление: библиотека с открытым исходным кодом.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
60
0
47 670
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы можете легко установить точки останова метода в сторонних библиотеках, не имея исходного кода. Просто откройте класс (вы получите представление «у меня нет источника»). Откройте схему, щелкните правой кнопкой мыши нужный метод и щелкните Toggle Method Breakpoint, чтобы создать точку останова для метода.

Для этого требуется, чтобы сторонняя библиотека была скомпилирована с отладочными символами.

Adam Monsen 03.03.2011 22:11

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

Adam Monsen 03.03.2011 22:18

@AdamMonsen Я понимаю путаницу, но если подумать, конечно, вы не можете поставить значимую точку останова на абстрактный метод ... этот метод никогда не вызывается, нет двоичного кода, в который можно было бы вплести точку останова. Eclipse не имеет возможности «ставить точку останова в начале всех переопределений этого метода», только для установки точки останова в конкретной конкретной реализации.

Theodore Murdock 08.07.2016 20:31

@akapelko Это все еще присутствует в текущих версиях Eclipse ... возможно, вы неправильно поняли указания? Приведенные шаги заключаются в том, чтобы открыть файл класса, затем, сфокусировавшись на этом файле класса, открыть представление «Структура» и щелкнуть там метод правой кнопкой мыши. Вы не увидите структуру класса в редакторе файла класса. Он также доступен из контекстного меню метода в проводнике пакетов.

Theodore Murdock 08.07.2016 20:37

Это все еще работает? Когда я открываю файл класса, я просто получаю The Class File Viewer cannot handle the given input ('org.eclipse.ui.ide.FileStoreEditorInput').. Должен ли он работать из диалогового окна «Открыть файл ...» в главном меню «Файл» или для него есть специальный диалог?

user2404501 21.06.2017 17:07

... и это потому, что он хочет, чтобы файл класса находился в пути сборки.

user2404501 21.06.2017 17:48

alt + shift + w для контура в окнах :)

vipin cp 20.06.2018 15:58

Обычно вы можете установить точку останова. Особенно, если сторонняя библиотека имеет открытый исходный код. Но если ваша сторонняя библиотека от коммерческого поставщика, возможно, они скомпилировали исходный код с отключенным флагом отладки. Это сделает невозможным отладку. Ваш поставщик мог сделать это как часть процесса обфускации, чтобы сделать невозможным обратное проектирование библиотеки, или просто потому, что окончательные скомпилированные классы будут меньше.

Спрошу у коллеги, отключен ли флаг отладки.

boutta 16.12.2008 13:27

Вы также можете установить точки останова для определенных исключений. С точки зрения отладки есть кнопка «Добавить точку останова на исключение Java», и там вы можете добавить «NullPointerException». Ваш отладчик приостановит выполнение, как только возникнет такое исключение.

Это не улавливает исключения, брошенные в библиотеку. Может быть, есть что-то в том, что сказал Бент с не установленными флагами отладки.

boutta 16.12.2008 15:49

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

Robin 16.12.2008 22:20

Я использовал это, чтобы поймать исключение сервлета в Eclipse, отлаживая проблему, которую я не мог уловить в самом коде приложения. Большое спасибо за этот совет!

James Drinkard 21.02.2014 22:09
Ответ принят как подходящий

Самый верный способ сделать это (и получить что-то действительно полезное) - это загрузить исходный код (вы говорите, что это открытый исходный код) и настроить другой «Java Project», указывающий на этот источник.

Для этого загрузите и разархивируйте исходный код где-нибудь в вашей системе. Щелкните «Файл» -> «Создать» -> «Проект Java». В следующем диалоговом окне дайте ему имя проекта и выберите «Создать проект из существующего источника». Перейдите в корневой каталог библиотеки с открытым исходным кодом.

Предположим, что все дополнительные библиотеки, которые требуются для проекта, включены в загруженный вами проект, Eclipse разберется со всем и установит для вас путь сборки.

Вам нужно будет удалить jar-файл с открытым исходным кодом из пути сборки вашего проекта и добавить этот новый проект в путь сборки вашего проекта.

Теперь вы можете рассматривать это как свой код и выполнять отладку по своему желанию.

Это позволяет решить по крайней мере пару проблем с другими подходами:

  1. Вы можете «прикрепить источник» к файлу jar, но если файл jar был скомпилирован без отладочной информации, это все равно не сработает. Если файл jar был скомпилирован с отладочной информацией (lines,source,vars ... см. http://java.sun.com/j2se/1.3/docs/tooldocs/win32/javac.html и параметр -g).

  2. Вы можете добавить «точку останова исключения», чтобы видеть, когда возникает исключение NullPointerException, но это обычное исключение, и оно вполне может быть вызвано и обработано много (сотни?) Раз до того, которое вы ищете. Кроме того, без исходного кода вы не сможете увидеть большую часть кода, который генерирует исключение NullPointerException - вероятность того, что вы сможете выяснить, что не так, довольно мала.

при отладке внешней библиотеки, если мы видим комментарии в классах этой библиотеки, означает ли это, что она была скомпилирована с использованием опции -g? В документе указано, что -g : Generate all debugging information, including local variables., затем упоминаются только source, lines и variable. Я читал на coderanch, что real names of fields также используются coderanch.com/t/262054/java-programmer-SCJP/certification/…. Но о комментариях ничего не говорится.

Adrien Be 14.10.2013 13:02

Я ожидал, что опция -g позволит нам затем без проблем отлаживать, то есть иметь возможность синхронизировать отладчик с кодом. Я думаю, единственный способ сделать это - оставить файлы классов «нетронутыми». Это то, что это делает? примечание: я искал четкую информацию по этому поводу, но похоже, что создание банки с -g и без него - единственный способ узнать, что на самом деле меняется при использовании этой опции -g.

Adrien Be 14.10.2013 13:05

«Создать проект из существующего источника» не существует со времен Eclipse Indigo; просто снимите флажок «использовать расположение по умолчанию» и перейдите к расположению разархивированного источника. stackoverflow.com/a/10369262/733092

Noumenon 30.01.2020 18:52

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

Этот метод очень помог мне при отладке моего приложения, связанного с проектом с открытым исходным кодом. В моем случае у меня есть (а) банка с классами, (б) банка с соответствующими источниками и (в) я разархивировал исходники на свой локальный диск. Чтобы разместить точку останова на функции в проекте с открытым исходным кодом, я (1) открыл исходный файл конкретного локального диска в Eclipse и (2) поместил точку останова в нужную функциональную строку. Когда я запускал свое приложение, Eclipse был достаточно умен, чтобы сломаться в нужной точке.

Moshe Rubin 28.06.2016 11:26

Чтобы заставить это работать с материализованным веб-приложением maven, мне пришлось сделать три вещи.

1) Создайте новый проект eclipse с исходным кодом сторонней банки.

2) Удалите ссылку на банку из зависимостей pom.xml.

3) Добавьте новый проект eclipse в Deployment Assembly в свойствах проекта.

4) Добавьте новый проект eclipse в Свойства проекта -> Путь сборки Java -> Проекты существующего проекта, который ссылается на сторонний проект.

Если третий проект был добавлен в ваш репозиторий maven правильно с исходными кодами, maven автоматически загрузит соответствующий исходный код и позволит вам добавлять точки останова без необходимости выполнять какие-либо из вышеперечисленных шагов; однако я понял, что на это нельзя всегда рассчитывать.

Другие вопросы по теме