3

자바의 바이트 코드 계측에는 asm 프레임 워크와 bcel 및 javaassist 라이브러리가 있습니다. 일부 자바 클래스가 이미 등등 javaagent가 실행되는 시간, 예를 들어, java.lang.Thread의, java.lang.Class의,네이티브 java 바이트 코드 계측

에 의해로드되기 때문에

그러나 나는 어떤 라이브러리가 네이티브 코드에서 계측을 할 필요가 네이티브 코드에서 Java 클래스를 계측하기위한?

편집 : 약간의 혼란이 있습니다.

원하는 내용 : OnClassLoad 이벤트 훅을 사용하여 클래스가로드되는 동안 클래스의 바이트 코드를 변경하기 위해 JVMTI API를 사용하는 네이티브 자바 에이전트를 만듭니다.

+5

해결해야 할 원래 문제는 무엇입니까? –

+0

"네이티브 코드"란 무엇입니까? http://www.cs.ioc.ee/~ando/jbe/는 자바 바이트 코드를 직접 편집 할 수있는 도구를 제공합니다. –

+0

@ ThorbjørnRavnAndersen JavaAgent가로드되기 전에로드되는 스레드 및 클래스와 같은 클래스를 계측하고자하므로 네이티브 에이전트에 인스트루먼트되어야합니다. – pdeva

답변

-1

클래스가로드되면 클래스의 바이트 코드를 변경할 수 없습니다. 인스트루먼트가로드되기 전에 실행되는지 확인하거나 새 ClassLoader를 만들고 부모 클래스에 요청하지 않고 클래스를 다시로드 할 수 있습니다. 클래스는 ClassLoader 외부에로드 된 코드를 사용할 수 없습니다. 그 코드는 이전에로드 된 변경되지 않은 클래스를 참조하기 때문입니다.

+1

일단로드 된 바이트 코드를 변경하고 싶지 않습니다. 클래스가로드되는 동안 바이트 코드를 변경하기 위해 원시 에이전트를 사용하려고합니다. – pdeva

1

JIT는 바이트 코드를 원시 코드로 변환합니다. 네이티브 코드를 생성하려면 JIT가 수행하도록하거나 JNI를 통해 호출되는 원시 코드를 작성해야합니다.

아마 당신이 성취하려는 것은 다른 방법으로 더 간단하게 할 수 있습니다.

그 존재가로드 상태 OnClassLoad 이벤트 후크를 사용하여 클래스의 바이트 코드를 변경 JVMTI API를 사용하여 원시 자바 제를 만든다.

원하는 작업을 수행 할 필요는 없지만 왜 솔루션이 필요 이상으로 복잡해질 수 있습니까?

+0

원시 코드를 생성하고 싶지 않습니다. 클래스의 '바이트 코드'를 OnClassLoad 후크를 사용하여 기본 에이전트에로드하는 동안 변경하고 싶습니다. – pdeva

+0

이 경우 질문이 의미가 없습니다. 왜 네이티브 코드를 사용하여 바이트 코드를 생성해야할까요? –

+0

"javaagent가 실행될 때 일부 Java 클래스가 이미로드되었습니다."예 : Thread, Hashmap 등 – pdeva

7

박사 과정 연구 중에이 문제가 발생했습니다. 가장 좋은 대답은 자바 라이브러리 (ASM 사용)를 사용하여 별도의 JVM에서 바이트 코드 수정을 수행하는 것이 었습니다.

JVMTI 클래스로드 훅을 사용하여 클래스 파일을 캡처하고 tcp 연결을 사용하여 별도의 JVM으로 전송합니다. 클래스가 별도의 JVM 내에서 수정되면 JVMTI 에이전트로 리턴하여 JVMTI 에이전트를 VM 메모리에 복사하고 수정 된 클래스 파일에 대한 포인터를 JVM에 리턴합니다.

수정하고 싶었던 시스템 클래스 파일 (예 : java.lang.Object)로 프로파일 링되는 것과 동일한 JVM 내에서 클래스를 짜기가 너무 어려웠다. 직조를 수행하는 데 필요했습니다. 나는 c/C++ 바이트 코드 라이브러리를 사냥했다. 별다른 JVM 접근법을 사용하기 전에 마침내 사용했다.

위버 JVM의 호스트 이름/포트를 사용하여 JVMTI 에이전트를 매개 변수화하거나 요구 사항에 따라 일부 형태의 검색을 사용할 수 있습니다.

+3

몇 가지 다른 답변이 약간 잘못되었거나 잘못되었습니다. 로드 된 클래스, 심지어는 시스템 클래스의 바이트 코드를 변경할 수 있습니다. 클래스가로드되면 외부 서명 (필드/메소드 추가)에 영향을 미치지 않을 수도 있지만 메소드 본문은 변경 될 수 있습니다. JVM과 함께 배포되는 기본 heapTracker JVMTI는 java.lang.Object의 동작을 변경하는 방법을 보여줍니다. (). –