Stack 命令的语法和案例 | 学习笔记

简介: 快速学习 Stack 命令的语法和案例

开发者学堂课程【线上问题排查利器 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:]        执行次数限制//在前面两个命令当中也用到了,只让它执行多少次就退出,不然会不断追踪,就会输出。

image.png

下面通过三个例子来演示 stack 命令的使用。


二.stack 运行的案例

(1)案例一

想要获取 frimeFactors 它的调用的路径, frimeFactors 的调用路径是怎样的?它由 run 来调用,run 由 main 调用。

image.png

[arthas@6523]$ stack demo.MathGame pri

primeFactors print

[arthas@6523]$ stack demo.MathGame primeFactors

只叫回车即可,不用写任何条件表达式,因为有三个参数,只写了类名和方法的表达式,并没有写条件表达式,因为我们未进行过滤。现在按回车,即可看到执行结果。追踪了三次,调用方式一样。

image.png

然后退出,如果不退出,否则将一直向下执行。

这里的参数和之前学的参数一样,有现成的时间,名字,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个参数。

image.png

这两次即可发现,它们相同。

调用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命令的作用是什么?

输出当前方法被调用的路径

相关文章
|
数据安全/隐私保护
runas的用法
今天同事的电脑安装了一个软件,运行时需要管理员权限,因为是在域环境中,无法提供管理员权限,这种情况可以用到runas。runas命令就是可以在A账户中用B账户运行某个软件。 runas /user:用户名 软件路径 在了解了runas用法后,我先在CMD中输入命令 需要输入账户密码 输入密码成功后就可以运行软件了,检查一下,是以这个用户运行的软件 后来想想运行这个命令每次都要输入管理员密码,这就没什么效果了。
2680 0
|
5月前
|
Kubernetes 网络协议 网络安全
nftables用法介绍
nftables用法介绍
150 2
|
7月前
|
SQL 安全 数据库
关于QUOTENAME的用法
关于QUOTENAME的用法
|
8月前
ThreadHelper用法
ThreadHelper用法
38 0
|
8月前
|
数据安全/隐私保护
关于DotNetZip的用法
关于DotNetZip的用法
81 0
|
Java Spring
@ConditionalOnProperty的用法
@ConditionalOnProperty的用法
375 0
propertyIsEnumerable的用法
propertyIsEnumerable用法 语法和功能 obj.propertyIsEnumerable(prop): 判断prop属性是否是obj的可枚举属性
186 0
|
Java
Systrace的用法小结
通过SysTrace可以帮助我们分析性能问题,包含方法的耗时时长、CPU的使用情况、ANR、布局情况等;相比性能工具TraceView,主要用来分析每个方法的执行时间,对于冷启动而言,想抓trace只能通过代码的方式,这样会导致整个应用比较卡顿,测试出的方法时间,不是真正的执行时间,只能看下时间长短的相对占比。
3505 0