alibaba / arthas

Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas
https://arthas.aliyun.com/
Apache License 2.0
35.15k stars 7.41k forks source link

jad 与 dump 出来的类不一样 #2554

Closed ReaJason closed 4 months ago

ReaJason commented 1 year ago

环境信息

重现问题的步骤

  1. 使用 ByteBuddy 做 Java Agent 字节码增强
  2. jad com.ibm.ws.webcontainer.srt.SRTServletRequest getInputStream
  3. dump com.ibm.ws.webcontainer.srt.SRTServletRequest

期望的结果

What do you expected from the above steps?

实际运行的结果

没有异常信息,根据程序执行结果,程序执行结果与两者都不符

jad 运行结果为:

[arthas@306]$ jad com.ibm.ws.webcontainer.srt.SRTServletRequest getInputStream

ClassLoader:
+-org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader@a03c0e1c[com.ibm.ws.webcontainer:8.1.0(id=208)]
  +-sun.misc.Launcher$AppClassLoader@ef458d3c
    +-sun.misc.Launcher$ExtClassLoader@dace7a39

Location:
/opt/IBM/WebSphere/AppServer/plugins/com.ibm.ws.webcontainer.jar

         public ServletInputStream getInputStream() throws IOException {
             SRTServletRequest sRTServletRequest = this;
             try {
/*1127*/         if (TraceComponent.isAnyTracingEnabled() && logger.isLoggable(Level.FINE)) {
/*1128*/             logger.logp(Level.FINE, CLASS_NAME, "getInputStream", "this->" + sRTServletRequest + ": gotReader = " + sRTServletRequest._srtRequestHelper._gotReader);
                 }
/*1130*/         if (WCCustomProperties.CHECK_REQUEST_OBJECT_IN_USE) {
/*1131*/             sRTServletRequest.checkRequestObjectInUse();
                 }
/*1134*/         if (sRTServletRequest._srtRequestHelper._gotReader) {
                     throw new IllegalStateException(nls.getString("Reader.already.obtained", "Reader already obtained"));
                 }
/*1144*/         if (WCCustomProperties.ENABLE_MULTI_READ_OF_POST_DATA && sRTServletRequest._srtRequestHelper._InputStreamClosed) {
/*1146*/             sRTServletRequest._in.restart();
                 }
/*1150*/         sRTServletRequest._srtRequestHelper._gotInputStream = true;
/*1151*/         sRTServletRequest = sRTServletRequest._in;
                 return sRTServletRequest;
             }
             finally {
                 Object var2_2 = null;
             }
         }

Affect(row-cnt:3) cost in 8373 ms.

dump 的结果如下:

    public ServletInputStream getInputStream() throws IOException {
        SRTServletRequest var1 = this;

        Throwable var2;
        Object var6;
        label48: {
            WSServletInputStream var10000;
            try {
                if (TraceComponent.isAnyTracingEnabled() && logger.isLoggable(Level.FINE)) {
                    logger.logp(Level.FINE, "com.ibm.ws.webcontainer.srt.SRTServletRequest", "getInputStream", "this->" + var1 + ": gotReader = " + var1._srtRequestHelper._gotReader);
                }

                if (WCCustomProperties.CHECK_REQUEST_OBJECT_IN_USE) {
                    var1.checkRequestObjectInUse();
                }

                if (var1._srtRequestHelper._gotReader) {
                    throw new IllegalStateException(nls.getString("Reader.already.obtained", "Reader already obtained"));
                }

                if (WCCustomProperties.ENABLE_MULTI_READ_OF_POST_DATA && var1._srtRequestHelper._InputStreamClosed) {
                    var1._in.restart();
                }

                var1._srtRequestHelper._gotInputStream = true;
                var10000 = var1._in;
            } catch (Throwable var5) {
                var2 = var5;
                var6 = null;
                break label48;
            }

            var6 = var10000;
            var2 = null;
        }

        if (var2 != null) {
            Spy.onThrows("8a7b1f49-5994-4058-b8f3-92e5d4c50451", new Object[0], "com.ibm.ws.webcontainer.srt.SRTServletRequest", "getInputStream", var2);
            throw var2;
        } else {
            Spy.Result var3 = Spy.onAfter("8a7b1f49-5994-4058-b8f3-92e5d4c50451", new Object[0], "com.ibm.ws.webcontainer.srt.SRTServletRequest", "getInputStream", var6, this);
            if (var3.getRet() != null) {
                var6 = (ServletInputStream)var3.getRet();
            }

            if (var2 != null) {
                throw var2;
            } else {
                return (ServletInputStream)var6;
            }
        }
    }
RaymondLam1 commented 10 months ago