开发者学堂课程【线上问题排查利器 Alibaba Arthas(下):Watch 命令的演示案例】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/747/detail/13203
Watch 命令的演示案例
内容介绍:
一、演示案例
二、小结
一、案例演示
观察方法入参,对比前一个例子,返回值为空(事件点为方法执行前,因此获取不到返回值)
清除后只需在第一个例子的代码基础上修改一点加一个-b的参数,-b就是监控方法的入参,要在方法执行前监控,然后回车执行三次后结束。
此时可以发现入参有整数有负数,负数返回值为空,但正数也为空,因为是在方法执行前进行的监视,所以没有获得返回值。
观察当前对象中的属性,如果想查看方法运行前后,当前对象中的属性,可以使用 target 关键字,代表当前对象。
比方说想要看对象是什么样子的,还是以上面代码为例,我们只需要在方法前加一个target,然后回车就可以了。执行两次为例,可以发现target是代表了调用方法对象本身,这个方法对象本身result后面显示的是数学游戏类的对象里面的一些东西,里面主要显示了两个程序变量,第一个是random…看源码,在源码中我们可以看到,一个是random,一个是整数的illegal非法的参数,所以是观察当前对象中所有的属性。
回到现在程序我们可以看到,就两个属性,设置的级别为两级,所以可以看到random下一级的所有属性,同样也能看到它的值2233。
运行第二次,通过给的参数,我们可以获得这个对象当中的所有的属性,如果想要看其中的某一个属性,现将通过第四个例子讲解。
使用 target . field _ name 访问当前对象的某个属性
某个属性的写法就是点上这个属性名即可,只需要在target里面点上某个属性名,比如说看illegal ArgumentCount的属性名,将他的名字拷贝到target里面,因为只看这一个属性可以将-b的这些参数删掉,然后回车。
此时会发现显示的是illegal ArgumentCount这个属性,同样也是隔一秒钟调用一次,以上就是第四个例子。
同时观察方法调用前和方法返回后的结果,这里只调用两次,参数里﹣ n 2表示只执行两次。不指定次数的话会不断地在执行。
在前面方法的基础上改一下,要显示三个参数,显示方法调用前和方法调用后的参数值,
params 是参数, returnObj是返回值,加一个target代表当前对象,然后在这里面可以在指定其他的参数,-b是调用前,-x是显示的深度,-s表示方法调用后的一个监控点,再加一个-n2表示执行两次,按回车看一下执行结果:结果有三个,第一个是输入参数整数,第二个是代表对象的所有属性,第三个就是返回值,我们可以看到方法前的返回值是没有的,
方法后:
方法后第一个是参数,第二个是对象,第三哥代表的是返回值,返回值质因数分解出5,5,47,71.最后还有一个提示命令执行的次数最多两次,所以命令就此退出,可以通过-n的选项来查看。在Arthas当中,每个方法都可以用-h作为参数,这样就可以看到方法的用途,以及每个参数的解释,会发现每个参数的作用写的非常清楚,比如像s--success,就像上节课中猜测的一样(除了f--finish)
条件表达式的例子,输出第1参数小于0的情况。
通过条件表达式的方式,来进行过滤,输出第一个参数小于0的情况。大于0的不输出来,只输出小于0的情况。
回到最初,我们可以采用宿主,代表第0个参数就可以,因为我们确定了他只有一个参数,然后用target作为监视目标,依次是类名,方法名,还有ognl表达式,第四个参数指定‘params[0]<0’,注意params是复数,输好后回车。发现不是一秒一次了,原因是可能出现了大于0的情况但不会显示出来,所以不再是一秒钟一次,可能是几秒钟一次碰到一个小于0的。
正确代码如下:
[arthas @3670]$ watch demo . MathGame primeFactors "{ params [ 0], target }”" params [0]< 0 "
我们监视两个东西,第一个是入参,第二个是对象本身。我们没有指定它的深度,没有指定-x的参数所以深度默认值为1级,看不到里面的东西,而且所有的入参都是负数。说明我们的过滤条件起了作用。以上就是我们的全部例子。
二、小结:
参数、参数说明
[ b ]:begin 监视方法执行前的情况
[ e ]:exception 监视出现异常的情况
[ s ]:success 执行成功的情况
[ f ]:finish 执行完毕的情况,包含成功或失败
-x指定深度,-n指定执行次数…