Чому мій проект 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.