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
网友评论