cover_image

利用Arthas开启高效调试模式

当贝技术团队 当贝技术团队
2024年03月29日 10:03

图片

前言

通常,我们在生产环境遇到较难排查的问题,会先尝试在测试环境或预发环境中复现,然而某些问题无法在不同环境中复现,甚至重启就会导致问题现场信息丢失。


如果你考虑通过增加日志来帮助定位,则需要经历测试、预发、生产一整个流程,效率十分低下。这时候就需要一个比较强大调试或问题排查工具——Arthas,本文将从实际场景出发,介绍如何通过Arthas开启高效调试模式。


一、快速定位问题

1、定位接口方法

以下有一段模拟代码,该接口的作用是为了检查影片状态,只有上下架状态和审核状态都为true时才返回成功。

@Overridepublic SingleResponse<Boolean> check(Long videoId) {    boolean approvalCheck = this.approvalCheck(videoId);    boolean statusCheck = this.statusCheck(videoId);    return SingleResponse.of(approvalCheck && statusCheck);}
private Boolean statusCheck(Long videoId) { // 模拟状态检查 return Boolean.TRUE;}
private Boolean approvalCheck(Long videoId) { // 模拟审核状态检查 return Boolean.FALSE;}

问题表象是测试人员反馈影片状态应该为true,但接口返回false,由于关键地方没有打日志,不知道哪行代码的问题。借助Arthas可以想到的是,如果我能开启“上帝视角”观测到方法的出参和入参,说不定能发现问题。于是使用Arthas的watch命令观测方法执行情况。


2、生成观测命令

先安装“arthas idea”插件

图片

需要观测的方法名上右键,选择watch,如下图所示。

图片


3、运行Arthas

通常我们服务会部署在云上或服务器中,Arthas支持在Linux/Unix/Mac 等平台上一键安装,只需执行以下命令:

curl -L https://arthas.aliyun.com/install.sh | sh

上述命令会下载启动脚本文件 as.sh 到当前目录,你可以放在任何地方或将其加入到 $PATH 中。直接在 shell 下面执行./as.sh,就会进入交互界面。

官网教程 https://arthas.gitee.io/doc/install-detail.html


4、执行watch命令

执行步骤2生成的观测命令,即可开启该方法的监控(建议修改命令增加参数过滤)

watch com.*.*.app.service.AssetServiceImpl check '{params,returnObj,throwExp}'  -n 5  -x 3 'params[0]==123'

命令解释:

  • com.*.*.app.service.AssetServiceImpl:类的全限定名,即要监控的方法所在的类。

  • check:要监控的方法名。

  • {params,returnObj,throwExp}:表示你希望观察的内容。你可以根据需要从以下三个选项中选择:

    • params:方法的参数

    • returnObj:方法的返回值

    • throwExp:方法抛出的异常

  • -n 5:表示观测到5次后停止。

  • -x 3:表示打印观测对象的时候只打印3层嵌套结构。

  • params[0]==123:条件表达式,满足该条件的才会被观测到。


5、重新请求

check方法入参为123,出参data=false

图片

修改命令,将观测方法调整为观测approvalCheck和statusCheck方法,再次请求:

图片

图片

从结果可以看到,根本原因为approvalCheck方法返回了false,导致接口影片状态为false,所以问题就已经找到了,非常方便。


二、代码热部署

通常我们发现代码问题后,会本地修改代码重新部署,等上个10分钟再验证。那有没有更高效的方式呢?答案是有的,ArthasHotSwap插件登场,在IDEA插件市场中搜索“ArthasHotSwap”即可安装。


图片

操作步骤:修改代码 > 本地编译 > 选择Swap this class > 登录远程服务器 > 粘贴命令 > 热部署成功

图片


切记切记、生产环境不能进行热更新操作!!!

热更新是为了提搞开发效率的工具” 不等于 “解决线上问题的工具


另外需要注意的是,该插件是基于Arthas的redefine命令实现热部署,redefine又是基于JDK Instrumentation API实现的热部署,所以和debug方式实现一样有限制。


具体的限制如下:无法修改类名、方法名,无法修改类属性名称,无法新增类属性,无法新增非静态方法。由于该插件暂时无法获取内部类的class文件,所以暂时也不支持修改内部类。


三、小结

以上列举的仅仅是Arthas用途的冰山一角,仅仅起到了抛砖引玉的作用。要想深入学习Arthas可详细阅读一遍官网文档,github上也有Arthas的实践使用。



参考链接

https://arthas.gitee.io
https://www.yuque.com/arthas-idea-plugin/help/pe6i45 https://github.com/alibaba/arthas/issues?q=label%3Auser-case

继续滑动看下一个
当贝技术团队
向上滑动看下一个