java在线debug-greys

greys是一个基于java的Instrumentation实现的异常诊断工具,可以在不中断程序执行的情况下轻松完成问题排查工作

介绍

greys是一个基于java的Instrumentation实现的异常诊断工具,可以在不中断程序执行的情况下轻松完成问题排查工作。其原理是基于VirtualMachine类的attach以及asm的字节码增强。
greys wiki

部署

  1. 下载最新的greps包
    下载

  2. 解压后安装
    sh ./install-local.sh

Getting started

1
2
# attach 某个java进程,并且让其监听在$ip:$port这个地址,默认端口是3658
./greys.sh $pid@$ip:$port

表达式

命令支持的表达式都基于下表

关键字 解释
loader 本次调用类所在的ClassLoader
clazz 本次调用类的Class引用
method 本次调用方法反射引用
target 本次调用类的实例
params 本次调用参数列表,这是一个数组,如果方法是无参方法则为空数组
returnObj 本次调用返回的对象。当且仅当isReturn==true成立时候有效,表明方法调用是以正常返回的方式结束。如果当前方法无返回值void,则值为null
throwExp 本次调用抛出的异常。当且仅当isThrow==true成立时有效,表明方法调用是以抛出异常的方式结束。
isBefore 辅助判断标记,当前的通知节点有可能是在方法一开始就通知,此时isBefore==true成立,同时isThrow==false和isReturn==false,因为在方法刚开始时,还无法确定方法调用将会如何结束。
isThrow 辅助判断标记,当前的方法调用以抛异常的形式结束。
isReturn 辅助判断标记,当前的方法调用以正常返回的形式结束。

常用命令

  • sc

    1
    2
    # 查看类以及类加载器相关信息
    sc -d *Test print
  • tt

    1
    2
    3
    # 适用于查看方法执行问题
    # 查看类Test下print方法执行情况
    tt -t -n 3 *Test print

    tt wiki

  • monitor

    1
    2
    3
    # 适用查询方法性能问题
    # 每隔1秒统计一次Test类下print方法执行情况,包括RT,FT
    monitor -c 1 *Test print
  • stack

    1
    2
    # 打印调用线程栈
    stack *Test print
  • trace

    1
    2
    3
    # 查看线程栈调用时间
    # 只能追踪单层调用
    trace *Test print
  • ptrace

    1
    2
    # 结合trace和tt,可以查看多层线程栈
    ptrace -t *Test print
  • watch

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 观察方法的输入输出参数,类似aop
    # [b]:在方法调用之前观察
    # [e]:在方法抛出异常之后环节观察
    # [s]:在方法正常返回之后环节观察
    # [f]:在方法结束之后(正常返回和异常返回)环节观察
    # 偶有的关键字都适用
    # 查看第一个参数和第二个参数,并用下划线连起来
    watch -b *Test print 'params[0]+'_'+params[1]'

    # 查看返回的对象
    watch -f *Test print 'returnObj'

    # 调用返回对象的方法,查看调用后的对象
    watch -f *Test print 'returnObj.$method()'

watch wiki

java和scala

如果想观察scala object类,那么需要在类名后面增加$,比如org.test.Class$

ulysses wechat
订阅+