2013-03-08 2 views
7

내가 다음과 같이 브레이크 포인트 다음과 같은 코드를 실행하려고 멀티 스레드 코드에있는 모든 중단 점에서 중지하지 : 나는 제거하면 ...인 IntelliJ -

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

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

이 코드 만 전을 실행할 때 ++ 중단 점 적중 그 하나, 다른 스레드의 중단 점이 올바르게 맞춰집니다. 이 이상한 행동이 왜 발생합니까?

답변

6

이는 http://www.jetbrains.com/idea/webhelp/breakpoints-2.html에 설명되어 있습니다 : 인 IntelliJ의 IDEA가 중단 점에서 중지되지 않습니다 때

는 어떤 경우가 있습니다. 다음 상황을 고려하십시오. 두 개의 중단 점이 클래스의 다른 메소드에서 설정되고 일시 중단 정책이 모두로 설정됩니다. 중단 점 중 하나에 도달하면 일부 단계 조치가 수행됩니다. 스테핑 중에 다른 스레드가 두 번째 중단 점에 도달하면 IntelliJ IDEA가 중단되지 않습니다.

코드 예제를 복사하고 상황을 재현했습니다. 물론, 문서에서 말한 것처럼 i++ 중단 점에서 멈춘 후 F8 키를 누르면 다른 중단 점에서 프로그램이 중단되지 않습니다. 하지만 F9 (다시 시작)을 누르면 을 다른 중단 점에서 다시 중지합니다.

+0

개인적으로 이것이 경쟁 조건이라고 생각합니다. 내 경우에는 * 이력서 *는 여전히 ** 새 스레드에서 중단 점을 트리거하지 않습니다 **. 수정해야 할 유일한 방법은 새 스레드를 시작하기 전에 중단하지 않는 것입니다. 그러면 모든 것이 작동합니다. – kervin

+0

중단 점의 일시 중단 정책이 '모두'('스레드'와 반대)로 설정되어 있습니까? –

+0

예 그들은 모두 있습니다. 중단 점을 스레드 시작 지점에서 더 가깝게/더 멀리 이동하여 문제를 유발할 수 있으므로 어떤 종류의 경쟁 조건 만 확인할 수 있습니다. – kervin

0

다른 스레드는 이고 백그라운드에서 실행하려면이고, OS 스레드 스케줄러가 실행을 결정하면 실행됩니다. 중단 점이 있으면 충돌합니다.

방금 ​​코드를 실행할 때 시작되지 않으므로 i++의 중단 점이 즉시 적용됩니다.

+0

브레이크 포인트가 절대로 안타 ...메인 스레드가 실행을 끝내고, "Starting"문자열이 출력되어 라인이 실행되었지만 중단 점이 나타나지 않았 음 – Bober02

+0

@ Bober02 어쩌면 디버거가 멀티 스레드 디버그를 수행하지 않을 수 있습니까? –

0

방금이 문제가 발생했으며 여기에 부딪히는 다른 사람들을 위해 여기에이 동작의 이유와 변경 방법이 나와 있습니다.

Doron이 지적했듯이이 문제에 관한 문서가 있습니다. 그러나 중요 알아 두어야 할 점은 기본적으로 중단 점에 도달하면 JVM의 모든 스레드가 일시 중단된다는 것입니다.

당신이 기대하고있는 것은 (그리고 예상했던 것) 중단 점이있는 스레드 만 일시 중단된다는 것입니다.

이것은 당신이 원하는 것이 아니며, 내가 원하는 것도 아닙니다.

이 동작을 변경하고 원하는 동작을 제공하려면 다음과 같이하십시오.

1) 마진을 마우스 왼쪽 버튼으로 클릭하여 중단 점을 만듭니다.
2) ctrl + shift + F8을 눌러 중단 점 메뉴를 표시하십시오.
3) 중단 점을 선택하십시오. 당신은 그것에 대한 옵션을 볼 수 있습니다.
4) "Suspend"가 선택되어 있고 "Thread"라디오 옵션이 선택되어 있는지 확인하십시오.
5) "기본 설정"버튼을 클릭하십시오.

이제 실행하면 다른 스레드의 중단 점이 표시됩니다.