Trình gỡ lỗi Eclipse luôn chặn trên ThreadPoolExecutor mà không có ngoại lệ rõ ràng, tại sao?


209

Tôi đang làm việc với các dự án thông thường của mình trên Eclipse, đó là một ứng dụng J2EE, được tạo bằng Spring, Hibernate, v.v. Tôi đang sử dụng Tomcat 7 cho việc này (không có lý do cụ thể, tôi không khai thác bất kỳ tính năng mới nào, tôi chỉ muốn thử điều đó). Mỗi lần tôi gỡ lỗi ứng dụng của mình, nó xảy ra rằng trình gỡ lỗi Eclipse bật ra như nó đã đạt đến một điểm dừng, nhưng thực tế không phải vậy, nó thực sự dừng trên một tệp nguồn Java ThreadPoolExecutor. Không có dấu vết ngăn xếp trên bàn điều khiển, nó chỉ dừng lại. Sau đó, nếu tôi nhấp vào tiếp tục, nó sẽ tiếp tục và ứng dụng hoạt động hoàn hảo. Đây là những gì hiển thị trong cửa sổ trình gỡ lỗi:

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

Tôi thực sự không thể giải thích điều này, vì tôi hoàn toàn không sử dụng ThreadPoolExecutor. Phải là một cái gì đó từ Tomcat, Hibernate hoặc Spring. Điều đó rất khó chịu vì tôi luôn phải tiếp tục trong quá trình gỡ lỗi.

Bất kì manh mối nào?


1
@ AmosM.Carpenter không phải là Java EE, không phải JEE? Ngay cả liên kết của riêng bạn dường như cũng đề xuất như vậy
eis

Câu trả lời:


290

Theo dõi ngăn xếp được đăng chỉ ra rằng RuntimeException đã gặp trong luồng Daemon. Điều này thường được phát hiện trong thời gian chạy, trừ khi nhà phát triển ban đầu bắt và xử lý ngoại lệ.

Thông thường, trình gỡ lỗi trong Eclipse được cấu hình để tạm dừng thực thi tại vị trí nơi ném ngoại lệ, trên tất cả các ngoại lệ chưa được lưu . Lưu ý rằng ngoại lệ có thể được xử lý sau, hạ xuống trong khung ngăn xếp và có thể không dẫn đến luồng bị chấm dứt. Đây sẽ là nguyên nhân của hành vi quan sát.

Việc cấu hình hành vi của Eclipse rất đơn giản:
Chuyển đến Window > Preferences > Java > Gỡ lỗi và bỏ chọn Tạm dừng thực thi đối với các ngoại lệ chưa được phát hiện .


Trong trường hợp của tôi stackoverflow.com/questions/8911146/, nó không giúp được gì :-(
Gangnus

5
Tôi đã gửi lỗi Eclipse 384073 về điều này vì về cơ bản nó làm cho tùy chọn này không thể sử dụng được khi gỡ lỗi ứng dụng Web.
Daniel Serodio

9
Vô hiệu hóa "Tạm dừng thực thi đối với các ngoại lệ chưa được phát hiện" trên Eclipse là một cách giải quyết tồi tệ: nếu bạn muốn Eclipse tạm dừng các ngoại lệ chưa bị bắt thực sự, ví dụ như bắt nguồn từ mã của riêng bạn thì sao? Dường như với tôi đây là một lỗi trong Tomcat ...

3
@Luis: Mình cũng thắc mắc như vậy! Theo bug.eclipse.org/bugs/show_orms.cgi?id=384073#c4 , người ta có thể: vô hiệu hóa các điểm dừng toàn cầu, tạo một điểm dừng mới trên java.lang.Exception và áp dụng bộ lọc độc quyền đối với điểm dừng mới được tạo này.
rektide

3
@Daniel ... Có lẽ tốt hơn để gửi một vấn đề với nhóm Tomcat. Tôi nghĩ rằng hành vi này là mới trong Tomcat 7 ... Eclipse thực hiện những gì nó phải làm ... (không bao giờ nghĩ rằng tôi sẽ kết thúc việc bảo vệ Eclipse vào một ngày nào đó ... :)
Stijn de Witt

47

Có một giải pháp cụ thể hơn, ngăn chặn Eclipse phá vỡ RuntimeExceptionchỉ được ném từ một lớp nhất định.

  1. Thêm một điểm dừng ngoại lệ mới từ phối cảnh Gỡ lỗi
  2. Đi đến tài sản của nó
  3. Chuyển đến Lọc
  4. Trong "Giới hạn đối với (các) vị trí đã chọn", nhấp vào " Thêm lớp "
  5. Thêm vào java.util.concurrent.ThreadPoolExecutor
  6. Bỏ chọn hộp kiểm , nghĩa là những cái này sẽ bị bỏ qua

1
Tôi dường như không thể làm cho nó hoạt động với Tomcat 7 và Eclipse / STS 3.4.0. Có bất kỳ cài đặt khác cần thiết? Điểm dừng này có nên được đăng ký RuntimeExceptionkhông? Nó có phải kích hoạt hoặc vô hiệu hóa? 'Các địa điểm bị bắt' và 'Các địa điểm chưa được bắt đầu' nên được bật hay tắt?
Henrik Heimbuerger

2
Dường như điểm dừng ngoại lệ cần phải là java.lang.R nbException, phải được bật, chỉ dành cho vị trí chưa được phát hiện và không được kiểm tra lớp java.util.concản.ThreadPoolExecutor.
mario

Thật không may trên Ubuntu 14.04, "Giới hạn đối với (các) vị trí đã chọn" không khả dụng, đối với Eclipse Luna 4.4.0.
eeezyy


2

Tôi đã nhận thấy rằng điều này thường xảy ra sau khi sửa đổi các tệp máy chủ (jsp hoặc java) và STS gặp sự cố khi tải lại ứng dụng.

Điều này thường dẫn đến việc khởi động lại máy chủ để có được những thay đổi được đồng bộ hóa.

Sau khi giới thiệu JRebel - nó dường như đã biến mất. Vì vậy, tôi muốn nghĩ rằng đó là một vấn đề có thể lặp lại trong STS khi mã nóng trong chế độ gỡ lỗi.

Bằng cách loại bỏ các bản phát sóng nóng, nó sẽ loại bỏ sự cố với nó trong lớp ThreadPoolExecutor.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.