Чому мій проект Eclipse має точки фантомного відладчика?


74

У мене є невеликий проект, який при запуску в налагоджувачі Eclipse завжди, здається, зупиняється у рядку FileInputStream.class 106, де відкриваються файли. Точок зупинку не встановлено, але Eclipse поводиться точно так, ніби у мене тут є точка зупинку. Якщо я очищу всі точки зупинки, це все одно трапляється.

У мене є другий набагато більший проект у тій самій робочій області Eclipse, який не страждає від цієї проблеми.

Я просто перемістив менший проект зі своєї старої машини Linux, де я розробив його в Europa Eclipse і мав цю проблему, на свою нову машину Windows, де я продовжую бачити проблему в Ganymede Eclipse. Проблема зберігається в операційних системах та у версіях Eclipse, проте, очевидно, не в усіх проектах. Я не розумію! Я прокрутив кожен файл у каталозі цього проекту і не зміг знайти нічого, що могло б бути файлом, який якось скеровує Eclipse зупинитися у FileInputStream.

Додаткова інформація : очевидна точка зупинки насправді не стосується рядка 106 FileInputStream; це, здається, є точкою зупинки винятку для FileNotFoundException, яка викидається із власного коду, викликаного з цього рядка у FileInputStream. Але знову ж таки, схоже, у мене взагалі не встановлені точки зупинку. Чи визначені точки зупинку винятків десь ще?


Я сам про це дивувався, часто виявляю, що зупиняюся на місцях зупинки, які я міг би поклястись, що їх прибрав.
— Урі

Просто додав пояснення щодо цієї функції "призупинити будь-який невилучений виняток" за запитом
— VonC,

Відповіді:


113

Ви намагалися зняти вибір

Window > Preferences > Java > Debug : Suspend execution on uncaught exceptions

? (як, наприклад, згадано в цій темі )

текст заміщення

Чому Eclipse працює саме так?

Це сходить до 2002 року , коли ієрархія об’єкта точки зупинення була позбавлена.

Для того, щоб встановити точку зупинки, зі старим API клієнту потрібні об'єкти Java-моделі - наприклад IType, IFieldі т. Д.
У новому API все, що вимагає модель налагодження, це імена типів, імена полів тощо

Це дозволяє клієнтам встановлювати точки зупинку, коли Java Model Objects недоступні.
Клієнти тепер вказують ресурс, з яким пов’язують точку зупинки (до того, як ми обмежили його відповідними ресурсами Java-моделі).

Точки зупинки тепер також можна "приховувати" . Тобто їх не потрібно реєструвати у менеджера точок зупинки.
Точки зупинки також можна вибірково зберігати (маркери дозволяють зберігати лише всі / жоден тип маркера).
Це робить модель налагодження більш гнучкою та надає клієнтам більше будівельних блоків.

Це також спростило деяку частину нашої реалізації налагодження Java - наприклад, функція " suspend on any uncaught exception" просто встановлює точку зупинки для типу з іменем " java.lang.Throwable", а не конкретну ITypeу конкретному проекті .
Точка зупинки не реєструється в менеджері точок зупинки (тобто прихована ) - вона відома і використовується лише одним клієнтом .
Інший приклад - " run to line breakpoint". Файл IJavaRunToLineBreakpointбуло видалено, оскільки його спеціальна функціональність більше не потрібна. Тепер інтерфейс налагодження Java просто створює "точку розриву рядка", яка є прихованою, не зберігається і має кількість звернень 1. Це приклад надання клієнтам будівельних блоків.


Це допомагає виявити ті неперевірені винятки під час виконання, які ваш код не зафіксував.
— VonC

Я стикаюся з такою ж поведінкою, і я не зняв прапорець "призупиняти виконання на винятках uhncaught". Я вважаю за краще залишити цю опцію позначеною, але мені було б цікаво знати, який виняток стався, як я можу це знати?
— HAL9000

@ HAL9000, якщо залишити цю опцію позначеною, чи не слід бачити, який виняток відбувається? Під "Я стикаюся з такою ж поведінкою", ви маєте на увазі, що у вас є "фантомні" точки зупинки?
— VonC

Так, я маю на увазі фантомні точки зупинку. Іноді в певному рядку спрацьовує фантомна точка зупинку. Однак ні LogCat, ні Console нічого не говорять про винятки. Також код здається без винятків, тоді мені було цікаво, де шукати повідомлення про виняток.
— HAL9000

@ HAL9000, можливо, він зламався на старому коді збірки з інформацією про налагодження, через неправильну чистку? Чи можете ви відтворити проблему, якщо видалите проект із робочої області Eclipse, скопіюєте джерело в іншому місці та повторно імпортуєте проект із скопійованих джерел назад у робочу область Eclipse?
— VonC

38

У мене була подібна проблема, але прийняте рішення для мене не спрацювало. Я розробляю Eclipse для Android, і я встановив деякі точки зупинки, а пізніше скасував їх. Незважаючи на те, що я їх відключив, Eclipse продовжував зупиняти виконання на цих фантомних точках зупинки. Рішенням для мене було відкрити вікно Breakpoints:

Вікно> Показати подання> Інше ...

Налагодження> Точки зупинки

Потім клацніть правою кнопкою миші будь-яку точку зупинки та виберіть "Видалити все"

На жаль, вам доведеться скинути всі свої діючі точки зупинку, але це спрацювало для мене і запобігло сильним роздратуванням і розчаруванням.

Деякі фотографії, якими можна керувати інших:

Додати вікно точки зупинку до Eclipse

Видалити все (точки зупинку, клацніть правою кнопкою миші)


Дякую, Марк. Це допомогло. Але я не видалив їх усіх, просто знайшов ту, яка спричинила неприємності.
— morphium

Дякую Марк! Працював у мене, але, як хлопець вище, я просто видалив того, хто мені був потрібен. Неприємно, що зареєстрована точка зупинки навіть не відображається у поданні редактора на бічній панелі. Справді, в цьому випадку вони є "фантомними" точками.
— The111

Можливо, я знайшов рішення проблеми, пов'язаної з вашим обхідним шляхом. Наступного разу, коли це станеться, спробуйте моє рішення нижче.
— HAL9000

Яка ганьба, що в 2020 році ми все ще страждаємо від цієї жахливої ​​помилки. Зверніть увагу, що питанню більше 11 років. Кожного разу, коли я редагую будь-який вихідний файл, мені доводиться видаляти всі свої точки зупинки. Це робить весь IDE непридатним для використання.
— Пере

5

Для тих, хто не вважає корисними інші рішення, я знайшов своє особисте рішення своєї проблеми. Я працюю з бібліотекою .jar, яка генерується шляхом вбудовування іншого проекту в робочу область. Якщо я встановив точку зупинки в .java в проекті бібліотеки, то точка зупинки буде спрацьовувати під час налагодження остаточного проекту. Однак коли налагоджувач призупиняє виконання, відображається файл .class, який має власні точки зупинку, і тому точка зупинку, встановлена ​​у .java-файлі, тут не відображається!

Рішення: Щоб видалити точку зупинки, потрібно видалити точку зупинки у файл .java у проекті бібліотеки.


2

Я зіткнувся з проблемою, коли у вихідному файлі були постійні маркери точок зупинку, яких не було. Я спробував очистити проект, виконати повну збірку, перезапустити Eclipse - нічого не вийшло.

Я перебрав метадані Eclipse і знайшов файл .markers проектів. Видалення цього файлу нарешті вирішило проблему.

Для всіх, хто має цю проблему, відкрийте каталог робочої області, а потім перейдіть до .metadata / .plugins / org.eclipse.core.resources / .projects / ваш проект, а потім перейменуйте / видаліть файл .markers.

Наприклад, якщо папкою робочої області є ~ / workspace, а ваш проект називається Foo, ви можете зробити:

$ mv ~/workspace/.metadata/.plugins/org.eclipse.core.resources/.projects/Foo/.markers ~/safe.Foo.markers

0

Для тих, хто не знайшов рішення з попередніх відповідей, вони можуть спробувати те, що вирішило мою проблему. Це, я думаю, схоже на проблему / рішення HAL9000

Якщо у вас є два класи з однаковою назвою (у двох різних проектах) точки зупинку в одному, застосовуйте і в іншому. Обидва вони відображаються у вікні "Точки зупинки".

Рішення : Якщо ви видалите точку зупинки з класу - з тим самим іменем - що ви не використовуєте, вона видаляє точку зупинки з класу, який ви налагоджуєте.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.