2013-03-08 7 views
7

Tôi cố gắng để chạy đoạn mã sau với điểm break như sau:IntelliJ - không ngừng trên tất cả các breakpoint trong mã đa luồng

new Thread(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("Starting"); //breakpoint here 
     } 
    }).start(); 

    int i = 10; 
    i++; //breakpoint here 

khi mã này chạy CHỈ i ++ breakpoint là hit ... Nếu tôi loại bỏ cái đó, điểm ngắt của luồng khác sẽ được nhấn chính xác. Tại sao hành vi kỳ lạ này lại xảy ra?

Trả lời

6

này được ghi chép lại trong http://www.jetbrains.com/idea/webhelp/breakpoints-2.html:

Có một số trường hợp khi IntelliJ IDEA sẽ không dừng lại ở một breakpoint. Hãy xem xét tình huống sau: Hai điểm ngắt được đặt ở các phương thức khác nhau của một lớp và có chính sách tạm ngưng được đặt thành Tất cả. Khi một trong các điểm ngắt được nhấn, một số hành động bước được thực hiện. Nếu tại thời điểm bước một luồng khác chạm đến điểm ngắt thứ hai, IntelliJ IDEA sẽ không dừng ở đó.

Tôi đã sao chép ví dụ mã của bạn và tạo lại tình huống. Chắc chắn, như đã nói trong tài liệu, sau khi dừng tại điểm dừng i++, nếu tôi nhấn F8 (bước qua) chương trình không dừng lại ở điểm ngắt khác. Nhưng nếu tôi nhấn F9 (tiếp tục) chương trình thì dừng lại ở điểm ngắt khác.

+0

Cá nhân tôi tin rằng đây là một điều kiện chủng tộc. Trong trường hợp của tôi * resume * vẫn không ** không ** kích hoạt điểm ngắt trên chuỗi mới. Cách duy nhất để khắc phục là không phá vỡ ngay trước khi bắt đầu một chuỗi mới. Sau đó, tất cả các công trình. – kervin

+0

Chính sách tạm ngưng trên các điểm ngắt của bạn được đặt thành 'Tất cả' (trái với 'Chủ đề')? –

+0

Có tất cả. Tôi có thể kích hoạt vấn đề chỉ đơn giản bằng cách di chuyển điểm ngắt gần hơn/xa hơn từ khi bắt đầu luồng, để chỉ một mình xác nhận điều kiện chủng tộc của một số loại. – kervin

0

Vì chủ đề khác là được lập lịch để chạy ở chế độ nền và khi trình theo dõi chuỗi hệ điều hành quyết định chạy nó, nó sẽ chạy. Khi bạn có điểm ngắt trong đó, nó sẽ bị đánh.

Nó sẽ không bắt đầu nhất thiết khi bạn chỉ cần chạy qua mã, do đó, các điểm ngắt tại i++ được nhấn ngay lập tức.

+0

Điểm ngắt không bao giờ được nhấn ...chủ đề chính kết thúc thực hiện, tôi có thể thấy chuỗi "Bắt đầu" được in, vì vậy dòng đã thực thi, nhưng không có điểm ngắt nào được nhấn – Bober02

+0

@ Bober02 có thể trình gỡ rối của bạn sẽ không thực hiện gỡ lỗi đa luồng? –

0

Tôi chỉ có vấn đề này và vì lợi ích của những người khác chạy vào đây, đây là lý do cho hành vi này và làm thế nào để thay đổi nó.

Như Doron đã chỉ ra, có tài liệu liên quan đến vấn đề này. Tuy nhiên, QUAN TRỌNG điều cần lưu ý là theo mặc định, tất cả các chuỗi trong JVM bị tạm ngưng khi đạt đến điểm ngắt.

Điều bạn đang mong đợi (và điều tôi mong đợi) là chỉ có chuỗi có điểm ngắt bị tạm ngưng.

Đây không phải là những gì bạn muốn, cũng không phải là những gì tôi muốn.

Để thay đổi hành vi này (và cung cấp hành vi mong muốn).

1) Tạo điểm ngắt bằng cách nhấp chuột trái vào lề.
2) Nhấn ctrl + shift + F8 (để hiển thị trình đơn điểm ngắt).
3) Chọn điểm ngắt của bạn. Bạn sẽ thấy các tùy chọn cho nó.
4) Đảm bảo đã chọn "Tạm dừng" và chọn tùy chọn radio "Chủ đề".
5) Nhấp vào nút "Đặt làm mặc định".

Bây giờ, khi bạn chạy, bạn sẽ thấy rằng các điểm ngắt trong các chuỗi khác nhau được nhấn.