Skip to content
oldmanpushcart edited this page Nov 19, 2014 · 30 revisions

诞生

很早的时候,我们使用BTrace排查问题,在感叹BTrace的强大之余,也曾好几次将线上系统折腾挂掉。2012年淘宝的聚石写了HouseMD,将常用的几个Btrace脚本整合在一起形成一个独立风格的应用,但其核心代码用的是Scala,我们没这方面的编程维护经验,所以只好艳羡HouseMD的才思敏捷而无法在其上增加功能。

于是乎,Greys诞生了。

PS:目前Greys仅支持Linux/Unix/Mac上的Java6+,Windows暂时无法支持

Greys是一个java进程执行过程中的异常诊断工具。 在不中断程序执行的情况下轻松完成问题排查工作。

和HouseMD一样,Greys-Anatomy取名同名美剧“实习医生格蕾”,目的是向前辈致敬。代码编写的时候参考了BTrace和HouseMD两个前辈的思路。

特性功能

  • **交互方式:**命令行交互,支持命令参数Tab提示补全。

  • 内置功能:

  • 查看加载类,方法信息

  • 方法执行监控(调用量,成功失败率,响应时间)

  • 方法执行数据观测(参数,返回结果,异常信息等)

  • 方法执行数据记录

  • 性能开销渲染

  • 方法执行数据自定义观测(js脚本)

  • 查看方法调用堆栈

  • 软件特点:

基于C/S架构的任务模式甚至能让多人同时远程到同一进程上执行不同的指令、脚本,非常适合团队一起进行线上问题排查与跟踪。Greys采用纯Java编写并留有良好的扩展,如果你有需求,只要你会Java,就可以为你自己编写想要的功能。 Greys最有利的武器是他的JavaScript脚本扩展,能让你在感受到HouseMD集成功能便利的同时,也能发挥出自定义Btrace脚本的灵活。

  • 安装使用便捷,仅一个jar包
  • 可无需重启JVM进行CT式诊断
  • javascript脚本增强
  • 常用命令集成
  • 多人并行协作
  • 纯Java实现的开源项目

安装:

Greys有两种安装方式,安装即可用,推荐使用命令行安装。

  1. 命令行安装(推荐)。请复制以下内容,并粘贴到命令行中。
curl -sLk http://ompc.oss.aliyuncs.com/greys/install.sh|ksh
  1. 手动下载安装
unzip greys.zip
cd greys
chmod +x greys

入门

启动Greys

启动范例 ./greys <PID>[@IP:PORT]

  • PID:目标Java进程ID(请确保执行当前执行命令的用户必须有足够的权限操作对应的Java进程)
  • IP: 目标服务器IP地址,当远程服务开启之后,其他人可以通过指定IP的形式加载到对应目标机器的Java进程中,从而实现远程协助。专门用于解决目标主机账号没有权限,但对方兄弟却非常需要你支援的时候。Greys允许多个用户同时访问,并且各自的命令不会相互干扰执行。
  • PORT: 目标服务器端口号,同一个Java进程能通过不同的端口号挂载不同版本的Greys(虽然我挺怀疑这样做的目的),但设计端口号的初心则是希望解决同台机器上存在多个Java进程需要被Greys分析的情况,默认的端口号是3658,如果不做区分则会引起端口冲突。

重要命令

命令 命令说明
help 查看命令的帮助文档,每个命令和参数都有很详细的说明。
sc 查看JVM已加载的类信息
sm 查看已加载的方法信息
monitor 方法执行监控
javascript JavaScript脚本增强
profiler 渲染调用链路,并输出链路以及链路上每个节点上的耗时
watch 方法执行数据观测
tt 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。
jstack 输出当前方法被调用的调用路径
shutdown 关闭greys服务端
quit 退出greys客户端
version 输出当前目标Java进程所加载的Greys版本号

重要类结构

用于watch/tt命令(express中的p入参),javascript命令的重要数据结构

Advice
   |-Target target (探测目标)
   |     |-String targetClassName (探测目标类)
   |     |
   |     |-String targetBehaviorName   (探测方法/构造器)
   |     |
   |     |-Object targetThis  (探测目标实例)
   |              |-String name
   |-Object[] params   (调用参数)
   |-Object returnObj      (返回值)
   |-Throwable throwException   (抛出异常)

用于javascript、普通AdviceListener回调时的时候数据信息的数据结构 OutPut:输出器

OutPut (PrintWriter)
   |-println(String msg)   (打印)

TLS(threadlocal),用户并发环境下Thread的沟通问题。

 TLS  (threadLocal)
  |-put(String key,Object value)
  |
  |-get(String key)
Clone this wiki locally