Eclipse 디버거는 항상 명백한 예외없이 ThreadPoolExecutor를 차단합니다. 왜 그렇습니까?


209

Eclipse에서 일반적인 프로젝트를 수행하고 있으며 Spring, Hibernate 등으로 만든 J2EE 응용 프로그램입니다. 나는 이것을 위해 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는 JEE가 아닌 Java EE가 아닌가? 당신의 자신의 링크조차도 그렇게 제안하는 것 같습니다
e는

답변:


290

게시 된 스택 추적은 데몬 스레드에서 RuntimeException이 발생했음을 나타냅니다. 원래 개발자가 예외를 포착하고 처리하지 않는 한 일반적으로 런타임에 포착되지 않습니다.

일반적으로 Eclipse의 디버거는 포착되지 않은 모든 예외에서 예외가 발생한 위치에서 실행을 일시 중단하도록 구성됩니다 . 예외는 나중에 처리 될 수 있으며 스택 프레임에서 아래로 내려가 스레드가 종료되지 않을 수 있습니다. 이것은 관찰 된 행동의 원인 일 것입니다.

Eclipse의 동작 구성 은 간단합니다. > 환경 설정 > Java > 디버그로
이동하여 포착되지 않은 예외에서 실행 일시 중지를 선택 취소하십시오 .


내 경우에는 stackoverflow.com/questions/8911146/… 그것은 도움이되지 않았습니다 :-(
Gangnus

5
웹 응용 프로그램을 디버깅 할 때 본질적 으로이 옵션을 사용할 수 없으므로 Eclipse 버그 384073을 제출 했습니다.
Daniel Serodio

9
Eclipse에서 "포착되지 않은 예외에 대한 실행 일시 중단"을 비활성화하는 것은 나쁜 해결 방법입니다. Eclipse가 실제 포착되지 않은 예외 (예 : 자신의 코드에서 시작)에서 일시 중단하도록하려면 어떻게해야합니까? 이것은 Tomcat의 버그 인 것 같습니다.

3
@ 루이스 : 나는 같은 궁금! bugs.eclipse.org/bugs/show_bug.cgi?id=384073#c4에 따라 , 글로벌 중단 점을 비활성화하고 java.lang.Exception에서 새 중단 점을 작성하고 새로 작성된 중단 점에 대해 독점 필터를 적용 할 수 있습니다.
rektide

3
@Daniel ... Tomcat 팀에 문제를 제기하는 것이 좋습니다. 나는이 문제가 톰캣 7의 새로운 생각 ... 이클립스가 어떻게해야 무엇합니까 ... (I 이클립스 어느 날을 방어 끝날 것이라고 생각하지 ... :)
스테인 드 위트

47

RuntimeException주어진 클래스에서만 Eclipse가 깨지는 것을 방지하는보다 구체적인 솔루션이 있습니다 .

  1. 새로운 예외 중단 점 추가디버깅 관점에서
  2. 속성으로 이동
  3. 필터링으로 이동
  4. 에서 "클릭"선택한 위치 (들)로 제한 " 클래스 추가 "
  5. 더하다 java.util.concurrent.ThreadPoolExecutor
  6. 확인란을 선택 취소 하면 무시됩니다.

1
Tomcat 7 및 Eclipse / STS 3.4.0에서 작동하지 않는 것 같습니다. 다른 설정이 필요합니까? 이 중단 점을 등록해야합니까 RuntimeException? 활성화 또는 비활성화해야합니까? '포착 위치'및 '포획되지 않은 위치'가 켜져 있거나 꺼져 있어야합니까?
Henrik Heimbuerger

2
예외 중단 점은 java.lang.RuntimeException이어야하고, 사용 가능해야하며, 포착되지 않은 위치에만 있어야하며, java.util.concurrent.ThreadPoolExecutor 클래스를 점검하지 않아야합니다.
마리오

불행히도 Ubuntu 14.04에서는 "선택한 위치로 제한"을 Eclipse Luna 4.4.0에서 사용할 수 없습니다.
eeezyy


2

서버 파일 (jsp 또는 java)을 수정 한 후 종종 발생하며 STS가 응용 프로그램을 다시로드하는 데 문제가 있음을 알았습니다.

이는 일반적으로 변경 사항을 동기화하기 위해 서버를 다시 시작하게합니다.

JRebel을 소개 한 후 사라졌습니다. 따라서 디버그 모드에서 코드를 핫 스왑 할 때 STS에서 재현 가능한 문제라고 생각합니다.

기본 핫 스와핑을 제거하면 ThreadPoolExecutor 클래스 내부에서 발생하는 문제를 제거합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.