阿里开源的greys对问题排查非常有用,其底层使用instrument和asm字节码增强,简单记录下这个命令的使用:
1.命令greys.sh java进程号,这样就会在目标机器上启动了服务端口3568和一个greys客户端,如果你是在目标机器上操作的话,你可以直接给予目标机器的greys客户端进行操作了。 如果你没有目标机器的权限,但是你要协助解决问题的话可以执行命令./greys.sh 目标机器Id:3568,这样也可以启动一个greys客户端,这样你就可以进行各种操作了
2.假设我们有一个类和方法原型:com.mytest.MyGreysService::getGreyInfo(Long uid,String name)
2.1 a. 查看参数的命令: watch -b com.mytest.MyGreysService getGreyInfo params[0] 该命令可以输出第一个参数的值,也就是uid的值。
b. 查看调用了这个方法本身的对象的其他字段的值:
watch -b com.mytest.MyGreysService getGreyInfo target.redisTemplate
这个就是查看调用了getGreyInfo方法的实例的字段redisTemplate的值
c.查看某个方法的异常信息:
watch -e com.mytest.MyGreysService getGreyInfo throwExp.printStackTrace()
2.2 查看方法调用耗时的命令:
trace -n 3 com.mytest.MyGreysService getGreyInfo 该命令可以查看getGrayInfo方法直接调用的第一层方法的耗时
2.3. 查看具体方法的耗时的命令
ptrace -t -n 3 MyGreysService getGreyInfo --path=com.test*
该方法可以查看getGrayInfo直接和间接调用的方法的耗时,具体输出哪些方法的耗时是通过path路径限制的
2.4 查看并回放具体方法调用:
tt -i index
该方法结合ptrace可以查看具体方法的参数和耗时等信息
tt -i index -p
该方法结合ptrace可以重放具体方法的调用,这样就可以重放对应的方法,调试的时候非常方便
2.5 查看方法的统计信息,调用耗时,异常数量等
a. tt -t com.mytest.MyGreysService getGreyInfo params[1] == “test” 参数的具体值
b. tt -t com.mytest.MyGreysService getGreyInfo params.length== 5 参数的总个数
c. tt -t com.mytest.MyGreysService getGreyInfo params[1].length()==4 第二个字符串参数的长度
这个工具对于查找各种问题非常方便