isadliliying
isadliliying
# no1. commit: 9e62fbc7cd85da9684dc7753b0cc059b7dc591cb ### 事出有因 这边在尝试增强kotlin1.4编译出来的class时,在一些lambda表达式中会出现增强失败的情况,其中使用了LocalVarsBinding,经过公司大佬的排查,发现kotlin会写入一些不会使用到的变量到 LocalVariableTable ,并且 LocalVarsBinding 在读取 LocalVariableTable 时,不会判定该变量是否有使用,因此增强后的字节码会校验失败. > Retransform时候的报错信息:  > Decompile时候的报错信息:  ### 期望的解决方法 如题,期待是能提供一个 exclude-pattern 支持,目前编译器产生的变量一般都是带有$的,通过表达式排除包含$的变量,能一定程度上解决这个问题. ### 如何复现 代码: https://github.com/isadliliying/bytekit/tree/wingli-before-line-enhance-error 增强报错的单元测试: com.alibaba.bytekit.asm.location.LineBeforeLocationMatcherEnhanceTest#testLocalVarsEnhanceError...
### 为什么要做这个呢? - 符合**Debug**的习惯,查看方法内的局部变量是理所当然的想法 - 协助快速定位排查问题,若通过加日志观测的话自由度会更大,但retransform会比较麻烦,而且往往随着排查深入,可能要加多个地方 - 有看到isuues里边也有一些小伙伴提到这个,需求有其合理性 - 所在业务已经使用1年有余,虽使用频率不如watch、trace,但仍能提高问题排查效率(上次提的[PR](https://github.com/alibaba/arthas/pull/2435)没有通过,这次完善了一些点🙏) ### 为什么要定义新的命令? - 跟观测非常契合的命令是`watch`,但是watch的对象是`method`,而我们观测`local variables`的时候,用`行`来作为定位点是比较合适的(因为同一个变量会被多次重复赋值),两者的回调监听是不一致的 - 独立一个命令也能降低对旧命令的影响,也能降低实现的复杂度 ### 实现思路: - 定义新的`Advice`变量 `varMap`,类型是`HashMap`,key是变量名,value是变量值 - 插桩的位置是命令参数传入的 LineNumber 或 LineCode(自定义的特殊值) 之前,并使用-1来表示方法退出前的插桩点 - 监听器的注册需要做相应的区分处理...