2009-04-15 4 views
29

jdi 인터페이스를 사용하여 디버거를 만들고 MethodEntryRequests를 사용하여 메서드 입력 추적을 사용하면 디버깅 된 프로그램이 수십 배로 느려집니다. 주 스레드 필터를 설정하고 SUSPEND_EVENT_THREAD 정책을 일시 중지했습니다. Classfilter는 제한적이며 수령 한 이벤트를 인쇄 할 경우 수십 개 이상의 이벤트가 표시되지 않으므로 너무 많이 받아서는 안됩니다. 나는 로컬 디버깅과 디버깅 자바 프로그램을 명령 줄의 followind 종류가 있어요 :메소드 항목 디버깅을 사용할 때 디버깅 된 프로그램의 속도가 느려지는 이유는 무엇입니까?

-Xdebug -Xrunjdwp:transport=dt_socket,suspend=y,server=y,address=1337

내가 디버거는 하나를 일치하는지 확인하기 위해 모든 메소드 호출에 일어나 할 필요가 있다고 가정 할
+0

좋은 질문에 간다. Eclipse에서 Java 프로그램을 디버깅 할 때 메서드 입력 중단 점이 상당히 느려졌습니다. 나는 누군가 응답을 가지고 있기를 바란다! –

+0

최근 자바 버전에서 상황이 개선 되었습니까? 아니면 동일합니까? – WSS

답변

30

짧은 대답은 메소드 항목이 설정 될 때 인터프리터를 통해 실행이 실행된다는 것입니다. 어쨌든이 주위에 있다고 생각하지 않습니다 ...

이 코드는 디버그 모드에서 실행되고 있지만 it was enhanced in 1.4 ... 이제 HotSpot은 다음과 같은 경우를 제외하고 '최고 속도'디버깅을 위해 작동합니다. 메소드 진입 점 및 종료점, 감시 점 및 단일 스테핑 또는 중단 점을 포함하는 메소드의 경우.

+1

정말 의미가 있습니다 ... HotSpot은 속도를 높이기 위해 모든 종류의 멋진 작업을 수행합니다 (포함 된 메서드 사이의 경계를 흐리게하는 인라인 메서드 포함). 무엇보다 메소드를 실행하는 방법이 변경 될 수 있으므로 실행 간에는 적응이 가능합니다. 당신이 디버깅 중일 때 당신이 원하는 일은 절대 아닙니다. – Ichorus

5

(s). 잠재적 인 매치가 실행되기 전에 모든 메소드 호출을 검사해야하기 때문에, 이러한 모든 검사를 수행 할 필요가없는 경우보다 상당히 느립니다.

9

2 가지 이유 :

    는 모든 방법 항목 에 검사를 추가 할 수있다
  1. 방법 인라인 불가능 (너무 작아서 방법이된다 10-100x를 실행합니다 (그냥 몇 가지 방법을 조정할 수있는 옵션이 없습니다)) 시간이 느린 같은

은 프로파일 및 .NET 애플리케이션

+1

메소드 인라이닝이 불가능 해지는 이유는 무엇입니까? –

+4

메소드 인라이닝은 더 이상 그 메소드가 없다는 것을 의미하기 때문에 전체 내용은 호출되는 모든 위치에서 INLINED되고 메소드 호출은 발생하지 않습니다. 그러나 디버거는 디버거가 필요로하는 곳이기 때문에 디버거가 필요합니다. – Mash

+0

소리는 유효하지만 소리가 나지 않습니다. INLINED 메소드는 여전히 디버거에 의해 추적 될 수 있습니까? 엄밀히 말하면 인라인되는 둘러싸는 방법을 알아야합니까? –