Налагоджувач 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.