美文网首页
Arthas学习四(最常用的命令)

Arthas学习四(最常用的命令)

作者: 裂开的汤圆 | 来源:发表于2020-12-28 02:11 被阅读0次

    monitor

    对匹配class-pattern/method-pattern的类、方法的调用进行监控。
    monitor命令是一个非实时返回的命令,实时返回命令是输入之后立刻返回,而非实时返回的命令,则是不断的等待目标Java进程返回信息。

    参数说明:
    class-pattern: 类名表达式匹配
    method-pattern: 方法名表达式匹配
    -E: 开启正则匹配
    -c: 统计周期,默认为120秒,可以通过monitor -c 60修改为60秒
    
    例子:
    每五秒监控一次MathGame中primeFactors()方法的返回值
    monitor demo.MathGame primeFactors -c 5
    
    image.png

    watch

    观察指定方法的调用情况
    能观察到的范围为:返回值、抛出异常、入参,通过编写OGNL表达式进行对应变量的查看

    基本语法,[]表示可选:
    watch class-pattern method-pattern express [condition-express]
    
    参数说明:
    class-pattern: 类名表达式匹配
    method-pattern: 方法名表达式匹配
    express: 观察表达式,ognl语法
    condition-express: 条件表达式,ognl语法
    -b: 在方法调用前观察,before
    -e: 在方法异常后观察,exception
    -s: 在方法返回之后观察, success
    -f:  在方法结束之后观察(正常返回和异常返回),finish
    -n: watch xxx... -n 2,表示只执行两次
    -E: 开启正则匹配
    -x: 结果属性遍历深度,默认为-x 1。例如,一个对象里的属性为List<Integer>,当深度为1时,我们只能看到对象里有一个List的属性,看不到List里保存的具体的值,当深度为2时就可以看到了
    
    特别说明:
    1.-b,-e,-s默认关闭,-f默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出
    2.这里要注意方法入参和方法出参的区别,有可能在中间被修改导致前后不一致,除了-b事件点params代表方法入参外,其余事件都代表方法出参
    3.当使用-b时,由于观察事件点是在方法调用前,此时返回值或异常均不存在
    
    例子:
    1.观察MathGame类中primeFactors方法的返回值,遍历深度为2
    watch MathGame primeFactors "{params, returnObj}" -x 2
    2.观察MathGame类中primeFactors方法的入参,深度为2
    watch MathGame primeFactors "{params, returnObj}" -x 2 -b
    3. 观察当前对象中的所有属性,在函数执行前
    watch MathGame primeFactors "target" -x 2 -b
    4.观察对象中某一个属性,在函数执行前,target指当前对象
    watch MathGame primeFactors "target.属性名" -x 2 -b
    5.同时观察方法调用前和方法返回后,参数里-n 2,表示只执行两次
    watch MathGame primeFactors "{params, target, returnObj}" -x 2 -b -s -n 2
    6.通过条件表达式,输出第一参数小于0的情况
    watch MathGame primeFactors "{params[0], target}" "params[0]<0"
    

    trace

    该命令可以对方法内部调用路径进行追踪,并输出方法路径上的每个节点耗时

    很多时候,我们只想看到某个方法的rt大于某个时间之后的trace结果,可以使用#cost耗时条件进行过滤,例如trace *StringUtils isBlank '#cost>100'表示当执行结果超过100ms时,才会输出trace的结果

    watch/stack/trace这三个命令都支持#cost耗时条件过滤

    基本用法:
    trace class-pattern method-pattern [condition-express]
    
    参数说明:
    class-pattern: 类名表达式匹配
    method-pattern: 方法名表达式匹配
    condition-express: 条件表达式,ognl语法
    -E:  正则匹配
    -n:  执行次数,例如 -n 2
    
    例子:
    1.trace函数指定类的方法
    trace MathGame run
    2.默认情况下,trace不会包含jdk里的函数调用,如果希望trace jdk里的函数,需要显式设置--skipJDKMethod false.
    trace --skipJDKMethod false MathGame run
    3.根据耗时过滤,trace大于100ms的调用路径
    trace MathGame run '#cost > 100'
    4.可以所使用的正则匹配路径上的多个类和函数,一定程度上达到多层trace的效果。
    trace -E com.test.ClassA|org.test.ClassB method1|method2|method3
    

    stack

    很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法时从哪里被执行了,此时需要的是stack命令

    基本用法:
    stack class-pattern method-pattern [condition-express]
    
    参数说明:
    class-pattern: 类名表达式匹配
    method-pattern: 方法名表达式匹配
    condition-express: 条件表达式,ognl语法
    -E:  正则匹配
    -n:  执行次数,例如 -n 2
    
    例子:
    1.查看MathGame类,primeFactors方法被执行的路径
    stack MathGame primeFactors
    2.条件表达式来过滤,第0个参数的值小于0
    stack MathGame primeFactors 'params[0]<0' 
    3.根据执行时间进行过滤,赛选出执行时间超过100ms的
    stack MathGame primeFactors '#cost > 100'
    

    tt

    watch 虽然很方便和灵活,但需要提前想清楚观察表达式的拼写,这对排查问题而言要求太高,因为很多时候我们并不清楚问题出自于何方,只能靠蛛丝马迹进行猜测。
    这个时候,如果能记录下当时方法调用的所有入参、返回值和抛出的异常会对整个问题的思考与判断非常有帮助。
    这个时候可以采用tt(time tunnel)

    基本语法:
    记录MathGame类primeFactors方法的调用
    tt -t MathGame primeFactors
    
    
    参数说明:
    -t: 记录某个方法在一个时间段中的调用
    -l: 显示所有已经记录的列表
    -n 1: 只记录1次
    -s 表达式: 搜索表达式
    -i  索引号: 查看指定索引号的详细调用信息
    
    问题场景:
    1.解决方法重载,记录Test类入参只有一个的print方法
    tt -t Test print params.length ===1
    2.记录Test类入参的第一个参数为Integer类型的print方法
    tt -t Test print 'params[0] instanceof Integer'
    3.解决指定参数,记录入参的第一个参数等于1的print方法
    tt -t Test print "params[0] == 1"
    4.将指定INDEX的记录,重复调用一次
    tt -i INDEX -p
    5.将指定INDEX的记录,重复调用三次
    tt -i INDEX -p --replay-times 3
    

    tt -t MathGame primeFactors


    image.png

    tt -i 1008


    image.png

    相关文章

      网友评论

          本文标题:Arthas学习四(最常用的命令)

          本文链接:https://www.haomeiwen.com/subject/egganktx.html