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