Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ScouterClassWriter에서 자바 기본 클래스 로딩에 실패하는 현상 #809

Closed
codingstore opened this issue Aug 4, 2021 · 1 comment
Assignees

Comments

@codingstore
Copy link

자바 에이전트에서 NPE가 발생하는 경우가 확인되어 리포팅합니다.

  private StringBuffer typeAncestors(String type, ClassReader info) throws IOException {
    StringBuffer b = new StringBuffer();
    while (!"java/lang/Object".equals(type)) {
      b.append(';').append(type);
      type = info.getSuperName();
      info = typeInfo(type);
    } 
    return b;
  }

자바 기본 클래스 (예시에서는 java.util.Properties)를 extend하는 클래스를 상위로 타고 올라가는 경우
typeInfo에서 null이 리턴되어 getSuperName 호출 시 null pointer exception이 발생합니다.

  private ClassReader typeInfo(String type) throws IOException {
    ClassLoader loader = AgentTransformer.hookingCtx.get();
    InputStream is = null;
    try {
      if (loader == null) {
        is = ClassLoader.getSystemResourceAsStream(type + ".class");
      } else {
    	//java/lang/object, java/util/Properties 등 기본클래스 로드시 null이 리턴
        is = loader.getResourceAsStream(type + ".class");
        //임시 우회 코드
        if(is == null){
        	is = ClassLoader.getSystemResourceAsStream(type + ".class");
        }
      } 
      if (is == null)
        return null; 
      return new ClassReader(is);
    } finally {
      if (is != null)
        is.close(); 
    } 
  }
20210804 13:09:03 [A101] Transformer Error : com/tmax/proobject/engine/servicemanager/thread/ServiceWorkerThread
java.lang.NullPointerException
        scouter.agent.asm.ScouterClassWriter.typeAncestors(ScouterClassWriter.java:127)
        scouter.agent.asm.ScouterClassWriter.getCommonSuperClass(ScouterClassWriter.java:81)
        scouter.org.objectweb.asm.SymbolTable.addMergedType(SymbolTable.java:1202)
        scouter.org.objectweb.asm.Frame.merge(Frame.java:1299)
        scouter.org.objectweb.asm.Frame.merge(Frame.java:1197)
        scouter.org.objectweb.asm.MethodWriter.computeAllFrames(MethodWriter.java:1610)
        scouter.org.objectweb.asm.MethodWriter.visitMaxs(MethodWriter.java:1546)
        scouter.agent.asm.ServiceMV.visitMaxs(ServiceASM.java:353)
        scouter.org.objectweb.asm.ClassReader.readCode(ClassReader.java:2636)
        scouter.org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1488)
        scouter.org.objectweb.asm.ClassReader.accept(ClassReader.java:718)
        scouter.org.objectweb.asm.ClassReader.accept(ClassReader.java:401)
        scouter.agent.AgentTransformer.transform(AgentTransformer.java:263)
        sun.instrument.TransformerManager.transform(TransformerManager.java:188)
        sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
        java.lang.ClassLoader.defineClass1(Native Method)
        java.lang.ClassLoader.defineClass(ClassLoader.java:763)
        jeus.service.archive.ArchiveClassLoader.defineClass(ArchiveClassLoader.java:607)
        jeus.service.archive.ArchiveClassLoader.findClass0(ArchiveClassLoader.java:461)
        jeus.servlet.loader.ContextLoader.findClass0(ContextLoader.java:131)
        jeus.service.archive.ArchiveClassLoader.loadClassWithoutDelegation(ArchiveClassLoader.java:351)
        jeus.service.archive.ArchiveArrayClassLoader.loadClass(ArchiveArrayClassLoader.java:358)
        jeus.servlet.loader.ContextLoader.loadClass(ContextLoader.java:223)
        java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        com.tmax.proobject.engine.servicemanager.thread.ServiceWorkerThreadPool.instantiationServiceWorkerThread(ServiceWorkerThreadPool.java:176)
        com.tmax.proobject.engine.servicemanager.thread.ServiceWorkerThreadPool.createServiceWorkerThread(ServiceWorkerThreadPool.java:149)
        com.tmax.proobject.engine.servicemanager.thread.ServiceWorkerThreadPool.initializePool(ServiceWorkerThreadPool.java:112)
        com.tmax.proobject.engine.servicemanager.thread.ServiceWorkerThreadPool.(ServiceWorkerThreadPool.java:93)
        com.tmax.proobject.engine.servicemanager.ServiceGroupManager.runWorkerThread(ServiceGroupManager.java:457)
        com.tmax.proobject.engine.servicemanager.ServiceGroupManager.activate(ServiceGroupManager.java:452)
        com.tmax.proobject.engine.application.ApplicationManager.activateServiceGroup(ApplicationManager.java:1007)
        com.tmax.proobject.engine.application.ApplicationManager.activate(ApplicationManager.java:775)
        com.tmax.proobject.engine.application.ApplicationManager.run(ApplicationManager.java:219)
        com.tmax.proobject.engine.event.po.eventhandler.ProObjectReadyEventHandler.onEvent(ProObjectReadyEventHandler.java:69)
        com.tmax.proobject.model.event.EventHandler.handleEvent(EventHandler.java:64)
        com.tmax.proobject.engine.event.po.EventLoopProcessor.executeLoop(EventLoopProcessor.java:165)
        com.tmax.proobject.engine.event.po.EventLoopProcessor.run(EventLoopProcessor.java:86)
        jeus.io.impl.nio.NIOSelector.run(NIOSelector.java:534)
        java.lang.Thread.run(Thread.java:748)
java.lang.NullPointerException
        at scouter.agent.asm.ScouterClassWriter.typeAncestors(ScouterClassWriter.java:127)
        at scouter.agent.asm.ScouterClassWriter.getCommonSuperClass(ScouterClassWriter.java:81)
        at scouter.org.objectweb.asm.SymbolTable.addMergedType(SymbolTable.java:1202)
        at scouter.org.objectweb.asm.Frame.merge(Frame.java:1299)
        at scouter.org.objectweb.asm.Frame.merge(Frame.java:1197)
        at scouter.org.objectweb.asm.MethodWriter.computeAllFrames(MethodWriter.java:1610)
        at scouter.org.objectweb.asm.MethodWriter.visitMaxs(MethodWriter.java:1546)
        at scouter.agent.asm.ServiceMV.visitMaxs(ServiceASM.java:353)
        at scouter.org.objectweb.asm.ClassReader.readCode(ClassReader.java:2636)
        at scouter.org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1488)
        at scouter.org.objectweb.asm.ClassReader.accept(ClassReader.java:718)
        at scouter.org.objectweb.asm.ClassReader.accept(ClassReader.java:401)
        at scouter.agent.AgentTransformer.transform(AgentTransformer.java:263)
        at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
        at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
        at jeus.service.archive.ArchiveClassLoader.defineClass(ArchiveClassLoader.java:607)
        at jeus.service.archive.ArchiveClassLoader.findClass0(ArchiveClassLoader.java:461)
        at jeus.servlet.loader.ContextLoader.findClass0(ContextLoader.java:131)
        at jeus.service.archive.ArchiveClassLoader.loadClassWithoutDelegation(ArchiveClassLoader.java:351)
        at jeus.service.archive.ArchiveArrayClassLoader.loadClass(ArchiveArrayClassLoader.java:358)
        at jeus.servlet.loader.ContextLoader.loadClass(ContextLoader.java:223)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at com.tmax.proobject.engine.servicemanager.thread.ServiceWorkerThreadPool.instantiationServiceWorkerThread(ServiceWorkerThreadPool.java:176)
        at com.tmax.proobject.engine.servicemanager.thread.ServiceWorkerThreadPool.createServiceWorkerThread(ServiceWorkerThreadPool.java:149)
        at com.tmax.proobject.engine.servicemanager.thread.ServiceWorkerThreadPool.initializePool(ServiceWorkerThreadPool.java:112)
        at com.tmax.proobject.engine.servicemanager.thread.ServiceWorkerThreadPool.(ServiceWorkerThreadPool.java:93)
        at com.tmax.proobject.engine.servicemanager.ServiceGroupManager.runWorkerThread(ServiceGroupManager.java:457)
        at com.tmax.proobject.engine.servicemanager.ServiceGroupManager.activate(ServiceGroupManager.java:452)
        at com.tmax.proobject.engine.application.ApplicationManager.activateServiceGroup(ApplicationManager.java:1007)
        at com.tmax.proobject.engine.application.ApplicationManager.activate(ApplicationManager.java:775)
        at com.tmax.proobject.engine.application.ApplicationManager.run(ApplicationManager.java:219)
        at com.tmax.proobject.engine.event.po.eventhandler.ProObjectReadyEventHandler.onEvent(ProObjectReadyEventHandler.java:69)
        at com.tmax.proobject.model.event.EventHandler.handleEvent(EventHandler.java:64)
        at com.tmax.proobject.engine.event.po.EventLoopProcessor.executeLoop(EventLoopProcessor.java:165)
        at com.tmax.proobject.engine.event.po.EventLoopProcessor.run(EventLoopProcessor.java:86)
        at jeus.io.impl.nio.NIOSelector.run(NIOSelector.java:534)
        at java.lang.Thread.run(Thread.java:748)

임의로 null 리턴 시 시스템 리소스에서 로딩해보도록 테스트를 해 보았는데
에러가 발생하지 않는것같습니다.

참고부탁드립니다

@gunlee01 gunlee01 self-assigned this Aug 5, 2021
@gunlee01
Copy link
Member

gunlee01 commented Sep 6, 2021

감사합니다. 다음 버전에 적용 예정입니다.

@gunlee01 gunlee01 closed this as completed Sep 6, 2021
gunlee01 added a commit that referenced this issue Sep 6, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants