Java에서 일부 메소드/클래스를 계측하고 싶습니다. 그 목적을 위해 필자는 내가 선택한 몇 가지 클래스만을 도구로 사용하는 Java 에이전트를 작성했습니다. filterClasses이 클래스 악기로 내가 원하는 내가 일반적으로 계측 할 할 몇 가지 클래스를 반환바이트 코드의 인스트르멘 테이션이 asm로 끝나면 (자) java.lang.reflect.InvocationTargetException가 Throw됩니다.
instrumentation.addTransformer(myTransformer,true);
Class[] loadedClasses=instrumentation.getAllLoadedClasses();
Class[] modifiableClasses=ModifiableClasses(loadedClasses,instrumentation);
Class[] filteredClasses=filterClasses(modifiableClasses);
if(instrumentation.isRetransformClassesSupported()){
System.out.println("retransformation is Supported");
instrumentation.retransformClasses(filteredClasses);
}
이 어떤 문제를 만들지해야
나는로드 된 클래스를 얻고 그 중 일부를 필터링하기 위해 다음 코드를 사용하여 :
- Ljava/nio/Buffer;
- Ljava/util/HashMap $ Entry;
- Ljava/nio/HeapCharBuffer;
- Ljava/nio/CharBuffer;
- Ljava/lang/ClassLoader;
- Ljava/lang/Class;
- Ljava/util/HashMap;
- Ljava/nio/ByteBuffer;
- Ljava/lang/System;
- Ljava/io/BufferedWriter;
- Ljava/lang/String;
- Ljava/io/OutputStreamWriter;
- Ljava/io/BufferedOutputStream;
- Ljava/nio/charset/CoderResult;
- Ljava/io/Writer;
- Ljava/util/HashSet;
- Ljava/nio/charset/CharsetEncoder;
- Ljava/io/FileOutputStream;
- Ljava/io/PrintStream;
모든 것이 잘 작동합니다. 디버깅을 위해 특정 폴더에 계측 및 비공 인 클래스를 인쇄합니다. asm CoreAPI를 사용하여 악기 생성자, 원시 메소드, 추상 메소드 및 정적 변수를 사용하지 않는 메소드의 시작과 끝 부분에 몇 가지 지침을 추가합니다. 모든 클래스가로드되는 새로운 클래스를 계측 할 때 제대로 작동합니다. 나는이 클래스 로더 또는 여기에 특정 뭔가 뭔가를 이해하는 것은 내가 콘솔에 무엇을 얻을 해달라고 추측 :
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(Unknown Source)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(Unknown Source)
Caused by: java.lang.InternalError
at sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
at sun.instrument.InstrumentationImpl.retransformClasses(Unknown Source)
at my.Agent.Watcher.premain(Watcher.java:88)
... 6 more
FATAL ERROR in native method: processing of -javaagent failed
내가 올바른 방향으로도 링크 나 힌트를 얻을 수있는 모든 도움을 감사드립니다.
발견 한 오류가 무엇인가요? – AKS