bytekit icon indicating copy to clipboard operation
bytekit copied to clipboard

为 arthas 中实现look命令提供一些通用的支持

Open isadliliying opened this issue 2 years ago • 0 comments

no1. commit: 9e62fbc7cd85da9684dc7753b0cc059b7dc591cb

事出有因

这边在尝试增强kotlin1.4编译出来的class时,在一些lambda表达式中会出现增强失败的情况,其中使用了LocalVarsBinding,经过公司大佬的排查,发现kotlin会写入一些不会使用到的变量到 LocalVariableTable ,并且 LocalVarsBinding 在读取 LocalVariableTable 时,不会判定该变量是否有使用,因此增强后的字节码会校验失败.

Retransform时候的报错信息: 1234567

Decompile时候的报错信息: 企业微信截图_af9558e3-4b06-4052-a155-2e71eecccdbb

期望的解决方法

如题,期待是能提供一个 exclude-pattern 支持,目前编译器产生的变量一般都是带有$的,通过表达式排除包含$的变量,能一定程度上解决这个问题.

如何复现

代码: https://github.com/isadliliying/bytekit/tree/wingli-before-line-enhance-error 增强报错的单元测试: com.alibaba.bytekit.asm.location.LineBeforeLocationMatcherEnhanceTest#testLocalVarsEnhanceError 增强成功的单元测试: com.alibaba.bytekit.asm.location.LineBeforeLocationMatcherEnhanceTest#testLocalVarsEnhanceSuccess

no2. commit: 86f15a33437f17312933ca3dd48f93374ce0c58f

原因

希望使用注解传递一个String类型的参数,目前使用场景是在Arthas中进行监听时,使用传递该值作为监听的key

no3. commit: cfb2b9be6e4fb434513adca66eee22a872161a2e

为什么需要暴露是否被过滤掉的状态呢?

因为在使用行来进行增强(InterceptorProcessor#process)时发现如果没有明确出 匹配失败 和 被过滤 两种状态的话,在外层逻辑上没法做对应的处理(Arthas中无法判定是否需要注册listener)

isadliliying avatar Feb 24 '23 07:02 isadliliying