阿尔萨斯 调试docker环境 sideshow 阿尔萨斯_阿尔萨斯 调试docker环境

2、解压压缩包,并在代码运行的机器上 启动 arthas

java -jar arthas-boot.jar

效果如下图

阿尔萨斯 调试docker环境 sideshow 阿尔萨斯_阿尔萨斯 调试docker环境_02


3、选择对应应用程序

输入程序前的数字编号即可 例如 选择 ConsumerWebApplication 则输入 4 回车

阿尔萨斯 调试docker环境 sideshow 阿尔萨斯_源文件_03


看见这个图 则表示连接成功

如果没有成功 可去$HOME/logs/arthas/arthas.log 查看日志

正式开始

1、打开我们的代码 复制我们类的全路基

例如:com.alibaba.nacos.client.naming.net.NamingProxy

2、将该类的.class文件 反编译成java文件 到指定目录中(有源文件的 直接 在源文件上修改 )

jad --source-only com.alibaba.nacos.client.naming.net.NamingProxy > D://tmp//NamingProxy.java

3、使用编译器 打开 在想要修改代码的地方 进行修改

4、使用arthas提供的编译器 对java文件进行编译 编译后的class文件放到指定文件夹下

mc D://tmp//NamingProxy.java -d D://tmp

会生成一些class文件

阿尔萨斯 调试docker环境 sideshow 阿尔萨斯_源文件_04


5、将生成的class文件扔到线上

redefine D://tmp//com//alibaba//nacos//client//naming//net//NamingProxy$5.class

redefine D://tmp//com//alibaba//nacos//client//naming//net//NamingProxy$3.class

redefine D://tmp//com//alibaba//nacos//client//naming//net//NamingProxy$4.class

redefine D://tmp//com//alibaba//nacos//client//naming//net//NamingProxy.class

注意事项及碰见的问题

注意:虽然生成了 7个文件 但是 我只上传了 4个 是因为 其他三个在虚拟机中没有找到 上传也会报错的
怎么知道 有没有这些文件呢?
使用 sc 命令 查看JVM已加载的类信息
sc com.alibaba.nacos.client.naming.net.*

注意:redefine 后 这些文件 就不能被回滚了 重启后失效

问题: 将类的.class文件 反编译成java文件 再将java文件编译成class文件时 会报错

例如

阿尔萨斯 调试docker环境 sideshow 阿尔萨斯_源文件_05


编译的时候 会进行类型校验 会报

不兼容的类型: java.lang.Object无法转换为com.alibaba.nacos.client.naming.net.HttpClient.HttpResult

目前解决的方法 是 将 源文件 代码 粘过来

有源文件 或许 可以直接在源文件上进行修改

有时候源码粘过来也编译报错,暂时无解。

大部分时间是我们自己的代码中织入代码,因此自己本地启动后将class文件传上去也可以