[alibaba/arthas]jad反编译方法失败

2024-02-23 593 views
3
环境信息
  • arthas-boot.jar 或者 as.sh 的版本: 3.5.1
  • Arthas 版本: 3.5.1
  • 操作系统版本: Linux version 3.10.0-862.el7.x86_64
  • 目标进程的JVM版本: jdk1.8.0_45
  • 执行arthas-boot的版本: 3.5.1
重现问题的步骤
  1. jad com.lianlian.cb.cbewbizgateway.service.open.PaymentOrderWriteServiceImpl create
期望的结果

反编译成功

实际运行的结果

实际运行结果,最好有详细的日志,异常栈。尽量贴文本。

/*
 * Exception decompiling
 */
public RichOpenRes<PaymentOrderDetailRes> create(PaymentOrderWriteReq var1_1) {
    /*
     * This method has failed to decompile.  When submitting a bug report, please provide this stack trace, and (if you hold appropriate legal rights) the relevant class file.
     * 
     * org.benf.cfr.reader.util.ConfusedCFRException: Started 2 blocks at once
     *     at org.benf.cfr.reader.bytecode.analysis.opgraph.Op04StructuredStatement.getStartingBlocks(Op04StructuredStatement.java:412)
     *     at org.benf.cfr.reader.bytecode.analysis.opgraph.Op04StructuredStatement.buildNestedBlocks(Op04StructuredStatement.java:487)
     *     at org.benf.cfr.reader.bytecode.analysis.opgraph.Op03SimpleStatement.createInitialStructuredBlock(Op03SimpleStatement.java:736)
     *     at org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysisInner(CodeAnalyser.java:845)
     *     at org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysisOrWrapFail(CodeAnalyser.java:278)
     *     at org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysis(CodeAnalyser.java:201)
     *     at org.benf.cfr.reader.entities.attributes.AttributeCode.analyse(AttributeCode.java:94)
     *     at org.benf.cfr.reader.entities.Method.analyse(Method.java:531)
     *     at org.benf.cfr.reader.entities.ClassFile.analyseMid(ClassFile.java:1042)
     *     at org.benf.cfr.reader.entities.ClassFile.analyseTop(ClassFile.java:929)
     *     at org.benf.cfr.reader.Driver.doClass(Driver.java:84)
     *     at org.benf.cfr.reader.CfrDriverImpl.analyse(CfrDriverImpl.java:75)
     *     at com.taobao.arthas.core.util.Decompiler.decompileWithMappings(Decompiler.java:89)
     *     at com.taobao.arthas.core.command.klass100.JadCommand.processExactMatch(JadCommand.java:182)
     *     at com.taobao.arthas.core.command.klass100.JadCommand.process(JadCommand.java:158)
     *     at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process(AnnotatedCommandImpl.java:82)
     *     at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.access$100(AnnotatedCommandImpl.java:18)
     *     at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:111)
     *     at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:108)
     *     at com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessTask.run(ProcessImpl.java:385)
     *     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
     *     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
     *     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
     *     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
     *     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
     *     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
     *     at java.lang.Thread.run(Thread.java:745)
     */
    throw new IllegalStateException("Decompilation failed");
}

回答

1

CFR貌似不支持嵌套的try catch

5

也有可能是一个try,mapping了多个catch

如try{} catch(ExceptionA e){} catch(ExceptionB e){} catch(ExceptionC e){}

改成try{} catch(ExceptionA | ExceptionB |ExceptionC e){}

2

确实有这样的逻辑在, 我看了别的业务代码, 发现存在大量的这种try catch catch逻辑 最后用一个catch一个通用的Exception, 这种写法是流行的么 为什么这种写法会影响反编译呢?

1

据我所知捕获通用Exception不太流行,大部分的check style也是不建议直接catch Exception的。多个异常和一个异常性能上也没太大区别,因为出异常时都是去查异常表。影响反编译的原因还是CFR目前不支持。。。