2016-06-11 1 views
1

디버거, 계측 및 JVMTI의 분야에서 새로운입니다. 그래서 나는 그들에 대해 몇 가지 질문이 있습니다.JDI, Java 바이트 코드 계측 및 Java 에이전트 (JWDP, JVMTI)

  1. JDI (Java Debugger Interface), JWDP, javaagent 및 네이티브 에이전트 (JVMTI)의 차이점은 무엇입니까? 및 Java 계측 API는 어디에 적합합니까?

  2. 대상 Java 응용 프로그램에서 예외를 가로 채기 위해 JDI를 사용하고 있습니다. 하지만 JDI가 목표 앱의 성능에 어떤 영향을 미치는지에 대해 이야기한다면 JDI가 충분하지 않다는 것을 알게되었습니다. JVMTI와 바이트 코드 계측을 결합하여 가장 적합한 애플리케이션이이를 수행한다고 읽었습니다. 하지만 바이트 코드 계측을 JVMTI와 함께 사용하는 방법을 이해할 수는 없습니다. 그렇다면 JVMTI와 함께 바이트 코드 계측을 어떻게 할 수 있습니까? 예제가 도움이 될 것입니다.

  3. 자바에서 바이트 코드와 기계 코드를 모두 입력 할 수 있습니까?

  4. 정적 바이트 코드 분석을 JVMTI와 함께 사용할 수 있습니까? 그렇다면 어떻게?

아무런 관련이 없거나 잘못 되었다면 알려주세요.

답변

2

1 - 나는이 사이트가 구별을 잘 설명한다고 생각한다 : http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/architecture.html - 이것들은 기본적으로 실행중인 JVM과 직접 인터페이스하는 JVMTI와 함께 서로의 위에 세워진 추상화의 3 계층이며, 그 다음 JDWP는 통신 프로토콜로 사용된다. JDI를 원격 JVM에 대한 인터페이스로 사용합니다. javaagent를 사용하여 바이트 코드 계측을 수행 할 수 있습니다 (이 세 가지 구현과 직각).

2 - 나는 이것을 수행하는 가장 좋은 방법은 예외를 처리하기 위해 각 메소드에 try/catch를 추가하도록 모든 코드를 계측하는 것이라고 생각합니다. 예외가 잡히면 처리 할 수 ​​있습니다.), 다시 던져라. 계측을 수행하는 가장 쉬운 방법은 javaagent 접근법 (javaassist 또는 asm 등을 사용)입니다. JVMTI에서 바이트 코드를 계측 할 수도 있지만, 훨씬 더 성가시다. 특정 예외 (즉, 명시 적으로 Throw 된 예외 및 NullPointerException, ArrayIndexOutOfBoundsException 등의 인터프리터에 의해 내부적으로 throw 된 예외)에만 관심이있는 경우이를 처리하는 가장 쉬운 방법은 ATHROW 명령어를 가로채는 것입니다 (명령어 예외를 throw하는 데 사용됩니다. 구체적인 경험은 없지만 Exception event에 등록 된 JVMTI 에이전트를 작성하는 것이 합리적 일 수 있지만 성능에 대해서는 확신 할 수 없습니다 (JDI 접근 방식과 마찬가지로 느릴 수도 있음).

3 - 아니오 : 자바로 실행중인 바이트 코드 만 계측 할 수 있습니다. 기계 코드를 계측하고 싶다면 핀과 같은 방법으로 시도해 볼 수는 있습니다. 그러나 이것은 아마도 여러분이 찾고있는 것에 방해가 될 것입니다.

4 - 확실한 : 어떤 종류의 정적 분석을 원하십니까? 확실히 그을음 같은 것을 사용할 수 있고 JVMTI도 사용할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 정적 분석에 대한 정보는 실제로 대상 응용 프로그램을 실행하지 않고 예외를 throw 할 수있는 코드 조각을 찾을 수있는 경우에만 사용됩니다. 어쨌든 가까운 장래에 바이트 코드 분석을 사용하지 않을 것입니다. 바이트 코드 분석이 JVMTI를 사용하여 수행 될 수 있다면 나는 골똘했다. 이것에 대한 약간의 튜토리얼을 지적하면 도움이 될 것입니다. 나는 이미 이것에 대한 Google 검색하지만 아무것도 찾을 수 없습니다. 감사. –

+0

관심있는 모든 사이트가 예외를 throw 할 수있는 정확한 사이트 (예 :'throw new MyException()';) 인 경우 ASM을 사용하여 ATHROW 명령어를 감지 한 다음 해당 사이트에서 일부 계측 도구를 방출 할 수 있습니다. 그러나 예외를 throw 할 수있는 코드를 호출 할 수있는 모든 호출 사이트를보다 광범위하게 찾는 것이 목표라면 정적 호출 그래프를 작성해야합니다. 그리고 그것을 위해, 나는 [soot] (https://sable.github.io/soot/)로 향했다. –

관련 문제