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가 깨지는 것을 방지하는보다 구체적인 솔루션이 있습니다 .
- 새로운 예외 중단 점 추가디버깅 관점에서
- 그 속성으로 이동
- 필터링으로 이동
- 에서 “클릭”선택한 위치 (들)로 제한 ” 클래스 추가 “
- 더하다
java.util.concurrent.ThreadPoolExecutor
- 확인란을 선택 취소 하면 무시됩니다.
답변
이 동작은 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 클래스 내부에서 발생하는 문제를 제거합니다.