2013-05-15 1 views
0

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 

내가 올바른 방향으로도 링크 나 힌트를 얻을 수있는 모든 도움을 감사드립니다.

답변

0

계기가있는 수업에서 좀 더 정확하게 살펴본 후 미안 해요. 실수로 해결해야 할 오류가 있음을 발견했습니다. 관리자/모드는이 스레드를 닫을 수 있습니다.

+0

발견 한 오류가 무엇인가요? – AKS