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

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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容