Налагоджувач Eclipse завжди блокується на ThreadPoolExecutor без явного винятку, чому?


209

Я працюю над своїми звичайними проектами на Eclipse, це додаток J2EE, зроблений з Spring, Hibernate тощо. Для цього я використовую Tomcat 7 (без особливих причин, я не використовую жодної нової функції, я просто хотів спробувати це). Кожного разу, коли я налагоджую свою програму, трапляється, що налагоджувач Eclipse вискакує так, ніби він досяг точки розриву, але це не так, адже він зупиняється на вихідному файлі Java, який є ThreadPoolExecutor. На консолі немає сліду стека, він просто зупиняється. Потім, якщо натиснути на резюме, це продовжується, і додаток працює чудово. Це відображається у вікні налагодження:

Daemon Thread ["http-bio-8080"-exec-2] (Suspended (exception RuntimeException)) 
    ThreadPoolExecutor$Worker.run() line: 912   
    TaskThread(Thread).run() line: 619

Я справді не можу пояснити це, тому що я взагалі не використовую ThreadPoolExecutor. Повинно бути щось із Tomcat, Hibernate або Spring. Це дуже дратує, тому що мені завжди доводиться продовжувати під час налагодження.

Будь-які підказки?


1
@ AmosM.Carpenter Це не Java EE, не JEE? Навіть ваша власна посилання , здається, пропонує так
— EIS

Відповіді:


290

Опублікований слід стека вказує на те, що в потоці Daemon знайдено RuntimeException. Це, як правило, не підлягає виконанню, за винятком випадків, коли оригінальний розробник виловлює та обробляє виняток.

Як правило, налагоджувач у Eclipse налаштований для призупинення виконання у місці, де було викинуто виняток, за всіма винятками, що не знайшли схоплювання . Зауважте, що виняток може бути оброблений пізніше, нижче в кадрі стека і може не призвести до припинення потоку. Це було б причиною спостережуваної поведінки.

Налаштування поведінки Eclipse просте:
Перейдіть у вікно > Налаштування > Java > Налагодження та зніміть прапорець Призупинити виконання за винятковими винятками .


У моєму випадку stackoverflow.com/questions/8911146/… це не допомогло :-(
— Gangnus

5
Я подав про це помилку Eclipse 384073, оскільки це по суті робить цю опцію непридатною для налагодження веб-додатків.
— Даніель Серодіо

9
Вимкнення "Призупинення виконання за винятковими винятками" на Eclipse є поганим вирішенням: що робити, якщо ви хочете, щоб Eclipse призупинився на справжніх виняткових винятках, наприклад, що походять з вашого власного коду? Мені здається, це помилка в Tomcat ...

3
@Luis: Я дивувався тим же! Відповідно до bugs.eclipse.org/bugs/show_bug.cgi?id=384073#c4 можна: вимкнути глобальні точки перерви , створити нову точку розриву на java.lang.Exception та застосувати ексклюзивний фільтр до цієї новоствореної точки розриву.
— rektide

3
@Daniel ... Можливо, краще подати проблему з командою Tomcat. Я думаю, що така поведінка є новою у Tomcat 7 ... Eclipse робить те, що повинен робити ... (ніколи не думав, що одного разу я захищаю Затемнення ... :)
— Stijn de Witt

47

Існує більш конкретне рішення, яке запобігає порушенню Eclipse на RuntimeExceptions, кинутому лише із заданого класу.

  1. Додайте нову точку розриву винятку з точки зору налагодження
  2. Перейдіть до його властивостей
  3. Перейдіть до фільтрування
  4. У розділі "Обмежити вибраними місцями" натисніть " Додати клас "
  5. Додайте java.util.concurrent.ThreadPoolExecutor
  6. Зніміть прапорець , тобто вони будуть проігноровані

1
Я не можу зробити так, щоб це працювало з Tomcat 7 та Eclipse / STS 3.4.0. Чи потрібні інші налаштування? Чи слід реєструвати цю точку перерви RuntimeException? Це потрібно ввімкнути чи вимкнути? Чи повинні бути ввімкнено або вимкнено функції "Захоплені місця" та "Неприховані місця"?
— Генрік Хаймбургер

2
Здається, що точка перерви винятку повинна бути java.lang.RuntimeException, повинна бути увімкнена, повинна бути лише для невлаштованого місця розташування, і не повинна перевірятися клас java.util.concurrent.ThreadPoolExecutor.
— Маріо

На жаль, на Ubuntu 14.04 "Обмежити вибраними місцями" недоступно для Eclipse Luna 4.4.0.
— eeezyy


2

Я помітив, що це часто відбувається після зміни файлів сервера (jsp або java), і STS має проблеми з перезавантаженням програми.

Зазвичай це призводить до перезавантаження сервера, щоб отримати його для синхронізації змін.

Після введення JRebel - здається, він пішов. Таким чином, я хотів би подумати, що це проблема, що відтворюється в STS, під час відміни коду в режимі налагодження.

Видаляючи нативну хот-заміну, вона усуває проблему з її порушенням всередині класу ThreadPoolExecutor.

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