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

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

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

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


person boutta    schedule 16.12.2008    source источник


Ответы (6)


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

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

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

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

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

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

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

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

person Jared    schedule 16.12.2008
comment
при отладке внешней библиотеки, если мы видим комментарии в классах этой библиотеки, значит ли это, что она была скомпилирована с использованием опции -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/ . Но про комментарии ничего не сказано. - person Adrien Be; 14.10.2013
comment
Я ожидаю, что опция -g позволит нам затем отлаживать без каких-либо проблем, то есть иметь возможность синхронизировать отладчик с кодом. Я думаю, единственный способ сделать это - оставить файлы классов нетронутыми. Это то, что это делает? примечание: я искал четкую информацию об этом, но кажется, что создание jar с & затем без -g - единственный способ узнать, что на самом деле меняется при использовании этой опции -g. - person Adrien Be; 14.10.2013
comment
Создание проекта из существующего источника не существует, поскольку Eclipse Indigo; просто снимите флажок «Использовать местоположение по умолчанию» и перейдите к местоположению вашего разархивированного источника. stackoverflow.com/a/10369262/733092 - person Noumenon; 30.01.2020

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

person Joachim Sauer    schedule 16.12.2008
comment
Для этого требуется, чтобы сторонняя библиотека была скомпилирована с отладочными символами. - person Adam Monsen; 03.03.2011
comment
Ах, может быть и нет... но я обнаружил, что не могу поставить точку останова метода в интерфейсе ServletResponse, в то время как я могу поставить ее в реализующем классе ( ServletResponseWrapper ). - person Adam Monsen; 03.03.2011
comment
@AdamMonsen Я понимаю путаницу, но если подумать, конечно, вы не можете поставить осмысленную точку останова на абстрактный метод ... этот метод никогда не вызывается, нет двоичного файла, в который можно было бы вплести точку останова. В Eclipse нет возможности поставить точку останова в начале всех переопределений этого метода, только поставить точку останова в конкретной конкретной реализации. - person Theodore Murdock; 08.07.2016
comment
@akapelko Это все еще присутствует в текущих версиях Eclipse ... возможно, вы неправильно поняли указания? Приведенные шаги заключаются в том, чтобы открыть файл класса, затем, сосредоточив внимание на этом файле класса, открыть представление «Структура» и щелкнуть правой кнопкой мыши метод. Вы не увидите структуру класса в редакторе файла класса. Он также доступен из контекстного меню метода в проводнике пакетов. - person Theodore Murdock; 08.07.2016
comment
Это все еще работает? Когда я открываю файл класса, я просто получаю The Class File Viewer cannot handle the given input ('org.eclipse.ui.ide.FileStoreEditorInput'). Это должно работать из диалогового окна «Открыть файл...» в главном меню «Файл» или для этого есть специальный диалог? - person ; 21.06.2017
comment
... и это потому, что он хочет, чтобы файл класса находился в пути сборки. - person ; 21.06.2017
comment
alt+shift+w для контура в окнах :) - person vipin cp; 20.06.2018

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

person lindelof    schedule 16.12.2008
comment
Это не улавливает исключения, брошенные в библиотеку. Может быть, есть что-то о том, что Бент сказал с неустановленными флагами отладки. - person boutta; 16.12.2008
comment
Я никогда не видел, чтобы это произошло. В JVM все еще есть трассировка стека, просто нет номеров исходников или строк, поэтому она все равно должна прерываться при исключении. - person Robin; 16.12.2008
comment
Я использовал это, чтобы поймать исключение сервлета в Eclipse, отладив проблему, которую я не мог поймать в самом коде приложения. Большое спасибо за этот совет! - person James Drinkard; 21.02.2014

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

person Bent André Solheim    schedule 16.12.2008
comment
Спрошу у коллеги, был ли отключен флаг отладки. - person boutta; 16.12.2008

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

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

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

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

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

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

person Ted Gulesserian    schedule 12.10.2015

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

person Robin Green    schedule 28.09.2012
comment
Этот метод очень помог мне при отладке моего приложения, связанного с проектом с открытым исходным кодом. В моем случае у меня есть (а) банка с классами, (б) банка с соответствующими источниками и (в) я распаковал исходники на свой локальный диск. Чтобы поместить точку останова в функцию в рамках проекта с открытым исходным кодом, я (1) открыл исходный файл определенного локального диска в Eclipse и (2) поместил точку останова в нужную строку функции. Когда я запускал свое приложение, Eclipse был достаточно умен, чтобы сломаться в нужном месте. - person Moshe Rubin; 28.06.2016