第六节 Arthas中的watch监视指令

亮子 2023-06-29 01:23:36 20283 0 0 0

watch主要功能

1、查看方法入参、返回值
2、过滤无用的输出
3、查看类中的成员变量
4、无法查看方法中的局部变量

图片alt

这部分可以先跳过,看完下面例子回过头来再看,这里重点要说明的是观察表达式,观察表达式的构成主要由 ognl 表达式组成,所以你可以这样写“{params,returnObj,target,throwExp}”,只要是一个合法的 ognl 表达式,都能被正常支持。

  • params:表示方法入参,可以通过params[0]获取指定位置的参数,可以用于过滤请求条件使用;

  • returnObj:表示方法返回参数;

  • target:表示类对象,可以通过target查看成员变量的值;

  • throwExp:表示异常;

特别说明:

  • watch 命令定义了4个观察事件点,即 -b 方法调用前,-e 方法异常后,-s 方法返回后,-f 方法结束后

  • 4个观察事件点 -b、-e、-s 默认关闭,-f 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出

  • 这里要注意方法入参和方法出参的区别,有可能在中间被修改导致前后不一致,除了 -b 事件点 params 代表方法入参外,其余事件都代表方法出参

  • 当使用 -b 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在

示例

1、查看方法入参和返回值

watch com.demo.service.DemoService getUser '{params,returnObj}' -x 3

图片alt

2、查看类对象的属性

watch com.demo.service.DemoService getUser 'target' -x 2

图片alt

3、查看类中静态变量,PATH为类中的静态成员变量

getstatic com.demo.service.DemoService PATH  -x 2

4、过滤不需要的请求

实际使用中会有不相关的请求调用我们的目标方法,可以通过添加过滤条件,只输出我们自己请求的日志,params[0]==‘demo’表示只有当第一个参数等于demo时才输出。

watch com.demo.service.DemoService getUser "{params,returnObj}" "params[0]=='demo'" -x 4

图片alt