2021-12-14

Docker+arthas排查线上问题

在dockerfile配置文件新增:

# copy arthasCOPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas


进入到docker容器中执行以下命令:

find -name "arthas"

java -jar arthas-boot.jar

并选择对应的java进程序号:那么就输入:1。选择后,arthas完成启动,并打印以下信息:




修改java文件

1、找到对应的类并反编译

比如下面我们需要在HandlerController这个类添加一些日志,那么需要找到对应的包路经然后,反编译到docker容器内的/tmp文件夹下,执行命令:

jad --source-only com.speakin.controller.HandlerController > /tmp/HandlerController.java

执行成功后,对应的java文件就会出现在docker容器的/tmp目录下了。这时候,我们需要另开一个会话窗口在容器内进行操作


2、编辑对应的类

把代码拷贝到容器外面进行修改:

新建一个服务器的回话窗口,并把对应容器id的对应java文件拷贝到当前用户目录下:

sudo docker cp [容器id]:/tmp/ HandlerController.java ~


# 编辑文件

vim ~/ HandlerController.java


修改完成后,再把文件拷贝回容器内:

sudo docker cp ~/ HandlerController.java [容器ID]:/tmp/ HandlerController.java


3、寻找对应的类加载器【我们后面编译的时候需要用到】

执行命令,查看对应类的类加载器的hash

sc -d * HandlerController | grep classLoaderHash

列出所有类加载器的hash:


可以看到对应的类加载器就是:LaunchedURLClassLoader

4、通过mc命令进行内存编译

mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/HandlerController.java -d /tmp

5、再使用redefine 重新加载对应的class文件

redefine /tmp/com/speakin/controller/HandlerController.class




!!!注意:服务重启,修改内容失效

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容