advice

无论是条件表达式也好、观察表达式也罢,他们核心判断变量都是围绕着一个Arthas中的通用通知对象Advice进行。

缩略代码如下:

public class Advice {

    private final ClassLoader loader;
    private final Class<?> clazz;
    private final ArthasMethod method;
    private final Object target;
    private final Object[] params;
    private final Object returnObj;
    private final Throwable throwExp;
    private final boolean isBefore;
    private final boolean isThrow;
    private final boolean isReturn;

    // getter/setter
}
变量名 描述
loader 本次调用类所在的ClassLoader
clazz 本次调用类的Class引用
method 本次调用方法引用
target 本次调用类的实例
params 本次调用方法参数列表,参数列表为一个数组,无参数则为一个空数组
returnObj 本次调用返回对象,若返回值类型为void,则值为null,需要结合isReturn判断
throwExp 本次调用抛出的异常,需要结合isThrow判断
isBefore 当前的通知在方法调用之前执行
isThrow 当前方法调用是否抛异常结束
isReturn 当前方法调用是否有返回值

所有变量都可以在表达式中直接使用,如果在表达式中编写了不符合OGNL脚本语法或者引入了不在表格中的变量,则退出命令的执行; 用户可以根据当前的异常信息修正条件表达式观察表达式

技巧

很多时候我们只想看到某个方法的 rt 大于某个时间之后的 trace 结果,现在 Arthas 可以按照方法执行的耗时来进行过滤了, 例如trace *StringUtils isBlank ‘#cost>100’表示当执行时间超过 100ms 的时候,才会输出 trace 的结果。 watch/stack/trace命令都支持#cost