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

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의 것이어야합니다. 디버깅하는 동안 항상 다시 시작해야하기 때문에 매우 성가시다.

단서가 있습니까?



답변

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

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

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


답변

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

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

답변

이 동작은 webapp가 다시로드 될 때 tomcat에 의해 트리거됩니다. 그것은 Tomcat의 “메모리 누수 방지”기능 의 일부로 다른 것들 중에서도 스레드를 강제로 갱신합니다.

이것은 현재 Tomcat 7.0.54 및 8.0.6 버전에서 수정되었습니다 :
https://issues.apache.org/bugzilla/show_bug.cgi?id=56492


답변

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

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

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

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


답변