Arthas watch 方法执行数据观测

watch 让你能方便的观察到指定方法的调用状况。能观察到的范围为:返回值抛出异常入参,经过编写 OGNL 表达式进行对应变量的查看。html

参数说明

watch 的参数比较多,主要是由于它能在 4 个不一样的场景观察对象java

参数名称 参数说明
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
express 观察表达式
condition-express 条件表达式
[b] 方法调用以前观察
[e] 方法异常以后观察
[s] 方法返回以后观察
[f] 方法结束以后(正常返回和异常返回)观察
[E] 开启正则表达式匹配,默认为通配符匹配
[x:] 指定输出结果的属性遍历深度,默认为 1
[n:] 命令执行次数
[#cost:] 方法执行耗时

这里重点要说明的是观察表达式,观察表达式的构成主要由 ognl 表达式组成,因此你能够这样写"{params,returnObj}",只要是一个合法的 ognl 表达式,都能被正常支持。git

观察的维度也比较多,主要体如今参数 advice  的数据结构上。Advice 参数最主要是封装了通知节点的全部信息。请参考表达式核心变量中关于该节点的描述。github

特别说明正则表达式

  • watch 命令定义了4个观察事件点,即 -b 方法调用前,-e 方法异常后,-s 方法返回后,-f 方法结束后
  • 4个观察事件点 -b-e-s 默认关闭,-f 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出
  • 这里要注意方法入参方法出参的区别,有可能在中间被修改致使先后不一致,除了 -b 事件点 params 表明方法入参外,其他事件都表明方法出参
  • 当使用 -b 时,因为观察事件点是在方法调用前,此时返回值或异常均不存在

同时观察方法调用前和方法返回后

$ watch demo.MathGame primeFactors "{params,target,returnObj}"  "params[0] instanceof java.lang.Integer"  -x 2 -b -s -n 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 46 ms.
ts=2018-12-03 19:29:54; [cost=0.01696ms] result=@ArrayList[
    @Object[][
        @Integer[1544665400],
    ],
    @MathGame[
        random=@Random[java.util.Random@522b408a],
        illegalArgumentCount=@Integer[13038],
    ],
    null,
]
ts=2018-12-03 19:29:54; [cost=4.277392ms] result=@ArrayList[
    @Object[][
        @Integer[1544665400],
    ],
    @MathGame[
        random=@Random[java.util.Random@522b408a],
        illegalArgumentCount=@Integer[13038],
    ],
    @ArrayList[
        @Integer[2],
        @Integer[2],
        @Integer[2],
        @Integer[5],
        @Integer[5],
        @Integer[73],
        @Integer[241],
        @Integer[439],
    ],
]
  • 参数里-n 2,表示只执行两次
  • 这里输出结果中,第一次输出的是方法调用前的观察表达式的结果,第二次输出的是方法返回后的表达式的结果
  • 结果的输出顺序和事件发生的前后顺序一致,和命令中 -s -b 的顺序无关

更多信息查看文档:https://alibaba.github.io/arthas/watch.htmlexpress

相关文章
相关标签/搜索