Arthas是什么?
官网(https://alibaba.github.io/arthas/index.html)是这么介绍的:
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
1、这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
2、我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
3、遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
4、线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
5、是否有一个全局视角来查看系统的运行状况?
6、有什么办法可以监控到JVM的实时运行状态?
7、怎么快速定位应用的热点,生成火焰图?
Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
很多线上棘手的问题,可以通过Arthas来定位。 官网上有教程,比较全面,不过有些点只是点到为止,需要大家自己去发现。
功能很多,今天写一下Watch 的一个用法。
watch
方法执行数据观测
让你能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。
通过watch 我们可以看到指定方法调用前后的数据,打印异常信息。
示例1:
#需要先启动Arthas,选择Java进程,方法非常简单,官网中快速入门有介绍
#方法调用结束后,打出入参与返回值
watch com.yrm.demo.Hello sayHi "{params, returnObj}" -x 2
参数说明:
watch 关键字
com.yrm.demo.Hello 类全量名
sayHi 方法名
params 代表入参(这是一个数组,可以通过params[i] 下标来标识具体的参数)
returnObj 代表返回值 (可以理解为返回值的上下文,可以通过OGNL获取具体的值)
-x 遍历深度, 2 表示深度为2
示例2:
# 方法调用结束后,打印第一个入参, 及返回值中result的值
watch com.yrm.demo.Hello sayHi "{params[0], returnObj.status,returnObj.context.entity.result}" -x 2
参数说明:
params[0] 表示第一个入参
returnObj.status,returnObj.context.entity.result 根据OGNL表达式输出result值
先写这点吧,现学现卖了,当真学海无涯。 ——料峭春风吹酒醒,微冷
特别说明:
-
watch 命令定义了4个观察事件点,即
-b
方法调用前,-e
方法异常后,-s
方法返回后,-f
方法结束后 -
4个观察事件点
-b
、-e
、-s
默认关闭,-f
默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出 -
这里要注意
方法入参
和方法出参
的区别,有可能在中间被修改导致前后不一致,除了-b
事件点params
代表方法入参外,其余事件都代表方法出参 -
当使用
-b
时,由于观察事件点是在方法调用前,此时返回值或异常均不存在
参数说明
watch 的参数比较多,主要是因为它能在 4 个不同的场景观察对象
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达式匹配 |
method-pattern | 方法名表达式匹配 |
express | 观察表达式 |
condition-express | 条件表达式 |
[b] | 在方法调用之前观察 |
[e] | 在方法异常之后观察 |
[s] | 在方法返回之后观察 |
[f] | 在方法结束之后(正常返回和异常返回)观察 |
[E] | 开启正则表达式匹配,默认为通配符匹配 |
[x:] | 指定输出结果的属性遍历深度,默认为 1 |
这里重点要说明的是观察表达式,观察表达式的构成主要由 ognl 表达式组成,所以你可以这样写"{params,returnObj}"
,只要是一个合法的 ognl 表达式,都能被正常支持。
--------------------------------
新版教程8月27号在官网发布了, 查找用法很方便