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




Вы можете легко установить точки останова метода в сторонних библиотеках, не имея исходного кода. Просто откройте класс (вы получите представление «у меня нет источника»). Откройте схему, щелкните правой кнопкой мыши нужный метод и щелкните Toggle Method Breakpoint, чтобы создать точку останова для метода.
Ах, может и нет ... но я обнаружил, что не могу поставить точку останова метода в интерфейсе ServletResponse, тогда как я мог бы поместить ее в реализующий класс (ServletResponseWrapper).
@AdamMonsen Я понимаю путаницу, но если подумать, конечно, вы не можете поставить значимую точку останова на абстрактный метод ... этот метод никогда не вызывается, нет двоичного кода, в который можно было бы вплести точку останова. Eclipse не имеет возможности «ставить точку останова в начале всех переопределений этого метода», только для установки точки останова в конкретной конкретной реализации.
@akapelko Это все еще присутствует в текущих версиях Eclipse ... возможно, вы неправильно поняли указания? Приведенные шаги заключаются в том, чтобы открыть файл класса, затем, сфокусировавшись на этом файле класса, открыть представление «Структура» и щелкнуть там метод правой кнопкой мыши. Вы не увидите структуру класса в редакторе файла класса. Он также доступен из контекстного меню метода в проводнике пакетов.
Это все еще работает? Когда я открываю файл класса, я просто получаю The Class File Viewer cannot handle the given input ('org.eclipse.ui.ide.FileStoreEditorInput').. Должен ли он работать из диалогового окна «Открыть файл ...» в главном меню «Файл» или для него есть специальный диалог?
... и это потому, что он хочет, чтобы файл класса находился в пути сборки.
alt + shift + w для контура в окнах :)
Обычно вы можете установить точку останова. Особенно, если сторонняя библиотека имеет открытый исходный код. Но если ваша сторонняя библиотека от коммерческого поставщика, возможно, они скомпилировали исходный код с отключенным флагом отладки. Это сделает невозможным отладку. Ваш поставщик мог сделать это как часть процесса обфускации, чтобы сделать невозможным обратное проектирование библиотеки, или просто потому, что окончательные скомпилированные классы будут меньше.
Спрошу у коллеги, отключен ли флаг отладки.
Вы также можете установить точки останова для определенных исключений. С точки зрения отладки есть кнопка «Добавить точку останова на исключение Java», и там вы можете добавить «NullPointerException». Ваш отладчик приостановит выполнение, как только возникнет такое исключение.
Это не улавливает исключения, брошенные в библиотеку. Может быть, есть что-то в том, что сказал Бент с не установленными флагами отладки.
Я никогда такого не видел. JVM по-прежнему имеет трассировку стека, только без исходных номеров или номеров строк, поэтому она все равно должна прерываться при исключении.
Я использовал это, чтобы поймать исключение сервлета в Eclipse, отлаживая проблему, которую я не мог уловить в самом коде приложения. Большое спасибо за этот совет!
Самый верный способ сделать это (и получить что-то действительно полезное) - это загрузить исходный код (вы говорите, что это открытый исходный код) и настроить другой «Java Project», указывающий на этот источник.
Для этого загрузите и разархивируйте исходный код где-нибудь в вашей системе. Щелкните «Файл» -> «Создать» -> «Проект Java». В следующем диалоговом окне дайте ему имя проекта и выберите «Создать проект из существующего источника». Перейдите в корневой каталог библиотеки с открытым исходным кодом.
Предположим, что все дополнительные библиотеки, которые требуются для проекта, включены в загруженный вами проект, Eclipse разберется со всем и установит для вас путь сборки.
Вам нужно будет удалить jar-файл с открытым исходным кодом из пути сборки вашего проекта и добавить этот новый проект в путь сборки вашего проекта.
Теперь вы можете рассматривать это как свой код и выполнять отладку по своему желанию.
Это позволяет решить по крайней мере пару проблем с другими подходами:
Вы можете «прикрепить источник» к файлу jar, но если файл jar был скомпилирован без отладочной информации, это все равно не сработает. Если файл jar был скомпилирован с отладочной информацией (lines,source,vars ... см. http://java.sun.com/j2se/1.3/docs/tooldocs/win32/javac.html и параметр -g).
Вы можете добавить «точку останова исключения», чтобы видеть, когда возникает исключение 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/…. Но о комментариях ничего не говорится.
Я ожидал, что опция -g позволит нам затем без проблем отлаживать, то есть иметь возможность синхронизировать отладчик с кодом. Я думаю, единственный способ сделать это - оставить файлы классов «нетронутыми». Это то, что это делает? примечание: я искал четкую информацию по этому поводу, но похоже, что создание банки с -g и без него - единственный способ узнать, что на самом деле меняется при использовании этой опции -g.
«Создать проект из существующего источника» не существует со времен Eclipse Indigo; просто снимите флажок «использовать расположение по умолчанию» и перейдите к расположению разархивированного источника. stackoverflow.com/a/10369262/733092
Просто прикрепите источник (или используйте что-то, что автоматически присоединяет исходную банку), а затем установите точку останова обычным способом, дважды щелкнув слева от интересующей строки.
Этот метод очень помог мне при отладке моего приложения, связанного с проектом с открытым исходным кодом. В моем случае у меня есть (а) банка с классами, (б) банка с соответствующими источниками и (в) я разархивировал исходники на свой локальный диск. Чтобы разместить точку останова на функции в проекте с открытым исходным кодом, я (1) открыл исходный файл конкретного локального диска в Eclipse и (2) поместил точку останова в нужную функциональную строку. Когда я запускал свое приложение, Eclipse был достаточно умен, чтобы сломаться в нужной точке.
Чтобы заставить это работать с материализованным веб-приложением maven, мне пришлось сделать три вещи.
1) Создайте новый проект eclipse с исходным кодом сторонней банки.
2) Удалите ссылку на банку из зависимостей pom.xml.
3) Добавьте новый проект eclipse в Deployment Assembly в свойствах проекта.
4) Добавьте новый проект eclipse в Свойства проекта -> Путь сборки Java -> Проекты существующего проекта, который ссылается на сторонний проект.
Если третий проект был добавлен в ваш репозиторий maven правильно с исходными кодами, maven автоматически загрузит соответствующий исходный код и позволит вам добавлять точки останова без необходимости выполнять какие-либо из вышеперечисленных шагов; однако я понял, что на это нельзя всегда рассчитывать.
Для этого требуется, чтобы сторонняя библиотека была скомпилирована с отладочными символами.