Debugger Eclipse zawsze blokuje ThreadPoolExecutor bez oczywistego wyjątku, dlaczego?

Pracuję nad zwykłymi projektami na Eclipse, jest to aplikacja J2EE, wykonana ze Springa, Hibernate i tak dalej. Używam do tego Tomcat 7 (bez konkretnego powodu, nie wykorzystuję żadnej nowej funkcji, chciałem tylko spróbować). Za każdym razem, gdy debuguję moją aplikację, zdarza się, że Eclipse debugger wyskakuje, jakby osiągnął punkt przerwania, ale tak nie jest, w rzeczywistości zatrzymuje się na pliku źródłowym Javy, który jest ThreadPoolExecutor. Nie ma śladu stosu na konsoli, po prostu się zatrzymuje. Wtedy jeśli kliknę na Wznów to trwa, a aplikacja działa idealnie. To jest to, co pokazuje się w oknie debuggera:

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

Naprawdę nie potrafię tego wyjaśnić, ponieważ w ogóle nie używam ThreadPoolExecutor. To musi być coś z Tomcat, Hibernate lub Spring. To bardzo irytujące, ponieważ zawsze muszę wznowić podczas debugowania.

Jakieś wskazówki?
Author: Luiggi Mendoza, 2011-06-09

4 answers

Opublikowany ślad stosu wskazuje, że RuntimeException został napotkany w wątku demona. Jest to zazwyczaj nieobciążone w czasie wykonywania, chyba że oryginalny deweloper złapał i obsłużył wyjątek.

Zazwyczaj, debuger w Eclipse jest skonfigurowany tak, aby zawiesić wykonanie w miejscu, w którym został wyrzucony wyjątek, na wszystkich nieobciążonych WYJĄTKÓW . Zauważ, że wyjątek może być obsługiwany później, niżej w ramce stosu i może nie prowadzić do zakończenia wątku. Byłoby to przyczyną zaobserwowanego zachowania.

Konfiguracja zachowania Eclipse jest prosta:
Przejdź do Okna > Preferencje > Java > Debug and uncheck Suspend executions.

 282
Author: Vineet Reynolds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-15 15:39:33

Jest bardziej konkretne rozwiązanie, które zapobiega łamaniu Eclipse na RuntimeExceptions rzucanych tylko z danej klasy.

  1. Dodaj nowy wyjątek breakpoint z perspektywy debugowania
  2. przejdź do jego właściwości
  3. przejdź do filtrowanie
  4. w polu "Ogranicz do wybranych lokalizacji "kliknij" Dodaj klasę "
  5. dodaj java.util.concurrent.ThreadPoolExecutor
  6. odznacz pole wyboru , co oznacza, że będą one ignorowane
 46
Author: EngineerBetter_DJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-15 12:51:29

To zachowanie jest wyzwalane przez tomcat, gdy aplikacja webapp jest przeładowywana. Jest częścią funkcji tomcat "memory leak protection" , która (między innymi) wymusza odnowienie wątków.

To jest teraz poprawione z wersji 7.0.54 i 8.0.6 tomcat : https://issues.apache.org/bugzilla/show_bug.cgi?id=56492

 22
Author: slaurent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-08 19:47:34

Zauważyłem, że często zdarza się to po modyfikacji plików serwera (jsp lub java) i STS ma problemy z przeładowaniem aplikacji.

Zazwyczaj prowadzi to do ponownego uruchomienia serwera w celu zsynchronizowania zmian.

Po przedstawieniu Jrebela-wydaje się, że odszedł. Tak więc, chciałbym myśleć, że jest to powtarzalny problem w STS, gdy hotswapping kod w trybie debugowania.

Usuwając natywny hotswapping, eliminuje problem z jego łamaniem wewnątrz klasy ThreadPoolExecutor.

 2
Author: DaCrazyCoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-17 21:01:45