说明
arthas是一个非常强大流行的java工具,可以让程序员在不修改代码的情况下去调试在线上运行着的程序,比如查看变量值,查看方法调用时间等,极大地提升了程序员排查线上问题的效率。
命令
watch
说明
查看方法调用的出参,入参,抛出的异常等。
用法
正则表达式看多个类和方法的调用情况
命令如下:
watch (com.xxxx.XXXXXXX|com.xxxxxxxx.xxxxxxService) (getXXXXX|XXXXXX|doXXXXX) '{params,target,returnObj}' -E -x 2
使用通配符以及排除指定的类
命令:
watch javax.servlet.Filter * --exclude-class-pattern com.demo.TestFilter
观察异常信息
命令:
watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2
条件表达式
命令:
# int比较
watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0"
# 字符串比较
# 使用 params[1] 这种数组访问的方式,对应到 primeFactors 方法的第二个参数
# 由于 condition 表达式整体使用了双引号 "",在字面量上需要使用单引号 ''
watch demo.MathGame primeFactors "{params,returnObj}" "params[1].getName().equals('xxxx')" -x 2
# 过滤集合中的元素;过滤对 pubg 感兴趣的 User 相关的请求
watch demo.xxx.arthas.Hello hello {params,returnObj} "params[1].getHobbies().contains('pubg')" -x 2
# 复杂多条件表达式组合,方便空指针判断
watch demo.xxx.actuator.demo.HelloController hello {params,returnObj} "params[1].getHobbies() != null && params[1].getHobbies().contains('pubg')" -x 2
ognl 条件表达式实现条件过滤
参考 issue:https://github.com/alibaba/arthas/issues/71
watch moe.xxx.xxx.demo.HelloController doXXXX "params[1].{? #this.name == 'hello'}" -x 2
和 直接使用条件过滤表达式的区别。ognl 这种过滤的方式,是针对对象的属性的过滤,无论是否匹配,都会被算进 watch 的匹配次数中,只不过没有匹配到的对象没有输出;而直接使用条件过滤表达式这种方式,只有被条件表示式命中的请求,才会被算进 watch 次数中。你可以使用 -n 1 来限定 watch 匹配次数,直观地观察到这两个匹配方式的差异。