ดีบักเกอร์ Eclipse จะบล็อกบน ThreadPoolExecutor เสมอโดยไม่มีข้อยกเว้นที่ชัดเจนทำไม?


209

ฉันกำลังทำงานในโครงการปกติของฉันใน Eclipse มันเป็นแอปพลิเคชัน J2EE ที่สร้างขึ้นด้วย Spring, Hibernate และอื่น ๆ ฉันใช้ Tomcat 7 ด้วยเหตุผลนี้ (โดยเฉพาะอย่างยิ่งฉันไม่ใช้ประโยชน์จากคุณสมบัติใหม่ใด ๆ ฉันแค่อยากลอง) เวลาที่ฉันแก้ปัญหาการสมัครของฉันทุกคนก็เกิดขึ้นที่คราสดีบักปรากฏออกมาเหมือนว่ามันจะได้ถึงจุดพัก แต่มันไม่ได้เป็นกรณีที่ในความเป็นจริงจะหยุดในแฟ้มแหล่งที่มา 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 ไม่ใช่ Java EE ไม่ใช่ JEE ใช่ไหม แม้การเชื่อมโยงของคุณเองดูเหมือนว่าจะแนะนำเพื่อให้
EIS

คำตอบ:


290

การติดตามสแต็กที่โพสต์บ่งชี้ว่าพบ RuntimeException ในเธรด Daemon โดยทั่วไปสิ่งนี้จะไม่ถูกตรวจจับที่รันไทม์เว้นแต่ผู้พัฒนาดั้งเดิมจะตรวจพบและจัดการข้อยกเว้น

โดยปกติแล้วการดีบักใน Eclipse มีการกำหนดค่าที่จะระงับการดำเนินการที่สถานที่ยกเว้นถูกโยนลงบนข้อยกเว้น uncaught ทั้งหมด โปรดทราบว่าอาจมีการจัดการข้อยกเว้นในภายหลังลดขนาดลงในกรอบสแต็กและอาจไม่นำไปสู่เธรดที่ถูกยกเลิก นี่จะเป็นสาเหตุของพฤติกรรมที่สังเกตได้

การกำหนดค่าลักษณะการทำงานของ Eclipseตรงไปตรงมา:
ไปที่หน้าต่าง > การกำหนดค่าตามความชอบ > Java > ดีบักและยกเลิกการเลือกการดำเนินการหยุดทำงานชั่วคราวเมื่อข้อยกเว้นที่ไม่ได้ตรวจสอบ


ในกรณีของฉันstackoverflow.com/questions/8911146/…มันไม่ได้ช่วย :-(
Gangnus

5
ฉันได้ยื่นข้อผิดพลาด Eclipse 384073เกี่ยวกับเรื่องนี้เพราะมันทำให้ตัวเลือกนี้ใช้งานไม่ได้เมื่อทำการดีบักเว็บแอป
Daniel Serodio

9
การปิดใช้งาน "ระงับการดำเนินการกับข้อยกเว้นที่ไม่ถูกตรวจจับ" บน Eclipse เป็นวิธีแก้ไขปัญหาที่ไม่ดี: ถ้าคุณต้องการให้ Eclipse ระงับข้อยกเว้นที่ไม่ได้ตรวจสอบจริงเช่นมาจากรหัสของคุณเอง สำหรับฉันดูเหมือนว่านี่เป็นข้อผิดพลาดใน Tomcat ...

3
@Luis: ฉันสงสัยเหมือนกัน! ตามbugs.eclipse.org/bugs/show_bug.cgi?id=384073#c4เราสามารถ: ปิดการใช้งานจุดพักทั่วโลกสร้างจุดพักใหม่บน java.lang.Exception และใช้ตัวกรองพิเศษกับจุดพักที่สร้างขึ้นใหม่นี้
rektide

3
@Daniel ... น่าจะดีกว่าถ้ามีปัญหากับทีม Tomcat ผมคิดว่านี่คือพฤติกรรมใหม่ใน Tomcat 7 ... คราสไม่สิ่งที่มันควรจะทำ ... (ไม่เคยคิดว่าจะจบลงด้วยการปกป้องคราสวันหนึ่ง ... :)
Stijn เดอวิตต์

47

มีวิธีแก้ปัญหาที่เฉพาะเจาะจงมากขึ้นซึ่งจะช่วยป้องกัน Eclipse ไม่ให้RuntimeExceptionส่งออกจากคลาสที่กำหนดเท่านั้น

  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

24

ลักษณะการทำงานนี้ถูกทริกเกอร์โดย tomcat เมื่อมีการโหลด webapp ใหม่ มันเป็นส่วนหนึ่งของคุณสมบัติ "ป้องกันการรั่วไหลของหน่วยความจำ"ของทอมแคท(อย่างอื่น) บังคับให้มีการต่ออายุเธรด

ตอนนี้ได้รับการแก้ไขแล้วจากรุ่น 7.0.54 และ 8.0.6 ของ tomcat: https://issues.apache.org/bugzilla/show_bug.cgi?id=56492


2

ฉันสังเกตว่ามักเกิดขึ้นหลังจากแก้ไขไฟล์เซิร์ฟเวอร์ (jsp หรือ java) และ STS มีปัญหาในการโหลดแอปพลิเคชันซ้ำ

ซึ่งมักจะนำไปสู่การรีสตาร์ทเซิร์ฟเวอร์เพื่อให้ได้รับการเปลี่ยนแปลงที่ซิงโครไนซ์

หลังจากแนะนำ JRebel - ดูเหมือนว่าจะหายไปแล้ว ดังนั้นฉันคิดว่ามันเป็นปัญหาที่ทำซ้ำได้ใน STS เมื่อรหัส hotswapping ในโหมดดีบัก

โดยการลบ hotswapping ดั้งเดิมมันจะช่วยขจัดปัญหาที่เกิดขึ้นกับมันภายในคลาส ThreadPoolExecutor

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.