Arthas神器入门:动态调试Java应用,轻松搞定生产环境Bug!

作为java开发,我们肯定都有在生产环境或者非本地环境遇到过bug,要是本地能复现还好,启动IDEA,运行程序一步步debug,总能找到问题的原因,但是如果遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?这个时候arthas 就出现了。

实战演示

例如我们现在有一个方法已经发布到线上去了,但是出现了bug,因为生产的数据和本地调试的数据会不同,但是我们又没有打印日志,就像这个方法一样:

这个时候我们出现了一个bug,导致了数据不正确,这个时候我们只需要在线上的服务器启动arthas 之后 watch 一下这个方法:

arduino 复制代码
watch com.zxy.product.exam.service.support.patrol.PatrolRecordServiceSupport handle '{params,returnObj,throwExp}'  -n 5  -x 3 

然后在页面上重新想办法触发这个方法,接下来我们就会得到这样的数据:

可以看到,这里面有我们传进来的参数 (params):

less 复制代码
@Object[][
    @String[683945314725646336],   # 参数1:字符串ID
    @Integer[1],                   # 参数2:整型值1
    @Optional[EMPTY],              # 参数3:空Optional
    @Optional[value=7c7c8a7b...],  # 参数4:带UUID的Optional
    @String[7c7c8a7b...]           # 参数5:字符串UUID
]

还有 返回值 (returnObj):

ini 复制代码
@Integer[2]  # 方法返回整型值2

而第三个则是 异常 (throwExp):

csharp 复制代码
null  # 无异常抛出

这样拿到我们的参数和返回值之后,排查问题起来就容易非常多,而不需要重新在代码层面添加日志,重新发版了。通过这么一个简单的演示我们见识到了 arthas的强大之处。那么我们现在来认识一下 arthas。

什么是arthas?

Arthas(阿尔萨斯) 是 Alibaba 开源的 Java 诊断工具,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

如何使用arthas?

第一步,下载arthas

其实arthas 也是一个jar包,我们需要把他下载到我们的本地或者服务器上面,下载地址:

bash 复制代码
https://arthas.aliyun.com/arthas-boot.jar

或者直接去github上面下载他的release(arthas-bin.zip)版本

github arthas地址

第二步启动arthas

得到这么一个jar包之后,我们就可以使用命令行启动起来了:

复制代码
java -jar arthas-boot.jar

第一次启动较慢,我们稍微等待一下,如果太慢的化可以使用 aliyun 的镜像

css 复制代码
java -jar arthas-boot.jar --repo-mirror aliyun --use-http

启动的是arthas-boot.jar 这个jar包

第三步,选择一个java服务

这里我们也使用官方案例中的一个java服务的演示jar包:

lua 复制代码
curl -O https://arthas.aliyun.com/math-game.jar
java -jar math-game.jar

启动之后,我们重新启动arthas(在上面的命令行输入 stop 否则需要把原来的进程kill掉),就会出现我们刚刚的程序:

我们输入 7 之后按回车键即可进入arthas的命令行页面 ([arthas@26452]$如图最后一行)。

第四步,watch

复制代码
watch demo.MathGame primeFactors returnObj

这个命令的意思就是 监控 MathGame 类的 primeFactors 方法返回值,而我们反编译看看我们刚刚启动的jar包里面的primeFactors方法:

在看看我们的程序命令行(左边)和arthas命令行(右边)完全对得上!!

第五步,watch命令进阶

上面的案例只是非常简单案例,但是就像作者前面watch的方法,大家发现会很长:

arduino 复制代码
watch com.zxy.product.exam.service.support.patrol.PatrolRecordServiceSupport handle '{params,returnObj,throwExp}'  -n 5  -x 3 

监控目标 :PatrolRecordServiceSupport类的handle方法 观察表达式 :{params,returnObj,throwExp}(监控入参、返回值、异常) 参数说明: -n 5:最多触发5次 -x 3:对象展开层级为3(控制输出深度)

你看又是 -n 又是 -x 这些都是什么意思?由于篇幅问题,而且死记硬背肯定效果非常差,所以我们直接去官网去看一下watch命令的参数都有什么就ok了:

watch 参数进阶

IDEA插件

如果看到上面的同学可能会问,watch那么多参数我怎么记得住啊,而且每次都要写全限定类名加方法加参数,这不很麻烦吗?别急!!arthas插件来帮你来了!!

基于IntelliJ IDEA开发的Alibaba Arthas 命令生成插件,支持Alibaba Arthas 官方常用的命令

我们只需要在idea的插件广场搜索 arthas 即可一键安装这个插件,有了这个插件之后,我们只需要在我们需要watch的方法上面这样操作(鼠标右键)即可:

然后我们就会得到这样的命令:

arduino 复制代码
watch demo.MathGame primeFactors '{params,returnObj,throwExp}'  -n 5  -x 3 

之后我们再跑到arthas的命令行输入即可:

OHHHHHHHHHHHHHH!!!

好啦,以上就是Arthas的入门指南啦!是不是感觉这个工具还挺酷的?通过Arthas,我们可以像"侦探"一样,轻松揪出Java应用中的各种"小毛病",再也不用因为生产环境中没有而日志抓耳挠腮了。

当然,Arthas的功能远不止这些,随着你用得越来越熟练,你会发现它还有很多隐藏的"大招"。比如,你可以用它来监控方法执行时间、动态修改代码,甚至还能在生产环境"热修复"问题!但是由于篇幅原因,就不再这里bb了。如果点赞过100,马上更新更多arthas的进阶技能!!!

相关推荐
无巧不成书021811 分钟前
30分钟入门Java:从历史到Hello World的小白指南
java·开发语言
苍何40 分钟前
30分钟用 Agent 搓出一家跨境网店,疯了
后端
ssshooter1 小时前
Tauri 2 iOS 开发避坑指南:文件保存、Dialog 和 Documents 目录的那些坑
前端·后端·ios
追逐时光者1 小时前
一个基于 .NET Core + Vue3 构建的开源全栈平台 Admin 系统
后端·.net
程序员飞哥1 小时前
90后大龄程序员失业4个月终于上岸了
后端·面试·程序员
zs宝来了2 小时前
Playwright 自动发布 CSDN 的完整实践
java
吴声子夜歌3 小时前
TypeScript——基础类型(三)
java·linux·typescript
GetcharZp3 小时前
Git 命令行太痛苦?这款 75k Star 的神级工具,让你告别“合并冲突”恐惧症!
后端
Victor3564 小时前
MongoDB(69)如何进行增量备份?
后端