开发者学堂课程【线上问题排查利器 Alibaba Arthas(下):Stack 命令的语法和案例】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/747/detail/13205
stack 命令的语法和案例
内容介绍
一.stack 的介绍
二.stack 运行的案例
一.stack 的介绍
Stack 是一条比较常用的命令。Watch,trace 和stack 是在后期用的比较多。
作用:输出当前方法和想要知道的某个方法被调用的整个调用路径。
介绍:很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多或者你根本就不知道这个方法是从哪里被执行了,此时你需要的是 stack命令。
在 java 编程时经常会发现有时候程序出现异常,此时它会把整个方法和调用张都给打印出来,所以 java 对此非常熟悉。而 stack 用来追踪程序执行过程中的调用路径,不一定是出错的时候才看到。所以想知道一个方法是怎样去调用,可以通过 stack 命令去了解。
参数说明
Watch,trace,stack 的参数说明大同小异。
参数名称
Class-pattern 类名表达式匹配
Method-pattern 方法名表达式匹配
Condition-pattern 条件表达式,OGNL
[E] 开启正则表达式匹配,默认为通配符匹配
[n:] 执行次数限制//在前面两个命令当中也用到了,只让它执行多少次就退出,不然会不断追踪,就会输出。
下面通过三个例子来演示 stack 命令的使用。
二.stack 运行的案例
(1)案例一
想要获取 frimeFactors 它的调用的路径, frimeFactors 的调用路径是怎样的?它由 run 来调用,run 由 main 调用。
[arthas@6523]$ stack demo.MathGame pri
primeFactors print
[arthas@6523]$ stack demo.MathGame primeFactors
只叫回车即可,不用写任何条件表达式,因为有三个参数,只写了类名和方法的表达式,并没有写条件表达式,因为我们未进行过滤。现在按回车,即可看到执行结果。追踪了三次,调用方式一样。
然后退出,如果不退出,否则将一直向下执行。
这里的参数和之前学的参数一样,有现成的时间,名字,ID,优先事项以及类加载器。
接下来看看是否有其它可能
凡是只要frimeFactors这个地方,它都是这三个方法调用的。
如何获取frimeFactors方法的调用路径?
(2)案例二
采用条件表达式来过滤第0个参数值小于0,-n表示获取二次。也就是说,它的参数小于0的,才显示它的路径,大于0就不显示。而且只获取2次。
代码怎么写?代条件表达式。
[arthas@6523]$ stack demo.MathGame primeFactors ‘params[0]小于0’ -n 2即可。再回去。要等一下,因为很多时候它不是小于0,它是大于0。
Params//所有参数 [0]//第0个参数。
这两次即可发现,它们相同。
调用main然后调用run,但是run和primeFactors有一点区别。小于0,就不调用demo.MathGame.primeFactors,调用路径有区别。
如果primeFactors调用了小于0,则方法并没有正常结束。如无正常结束,它并无完整地把结果打印出来。就说明这个方法中间出现了异常,只要小于0,以后看到它的值,这两行:
@demo.MathGame.run()
At demo.MathGame.main(MathGame.java:16)
确定它的方法在demo的情况下只看哪些参数,这有利于后期进行诊断。
(3)案例三
根据执行的时间来进行过滤,把耗时大于0.5毫秒的,把它显示出来。
这时,参数怎么写呢?
[arthas@6523]$ stack demo.MathGame primeFactors’#cost大于0.5’
执行路径都是只有两个,异常,导致执行时间的增加。查看是否两种情况都有,此时需要等,有时执行速度很快,有时很慢,在执行中暂时未发现,需要把时间调小一点。
假设把0.5改成0.25秒,还是暂未发现。1秒,2秒是输出它的耗时,具体的耗时,无法查看,用trace即可。
小结
Stack命令的作用是什么?
输出当前方法被调用的路径