Greys是一个Java进程的异常诊断工具,可以在不停止程序的前提下,对一些问题进行检测。这个框架主要是采用Java的探针技术,可以做到动态修改java的字节码技术。前提是Jdk版本6+。(premain是Java SE5开始就提供的代理方式,由于其必须在命令行指定代理jar,并且代理类必须在main方法前启动。因此,要求开发者在应用前就必须确认代理的处理逻辑和参数内容等等。在有些场合下,premain代理方式不能满足需求。为解决运行时启动代理类的问题,Java SE6开始提供了在应用程序的VM启动后在动态添加代理的方式,即agentmain方式。 )

一、我的经历

我是一个Java开发人员,第一次使用greys是2年前,当时开发的项目是一个大型系统,开发人员比较多。但是,开发和测试环境都只有一套。这样就有一个问题,那就是每个人代码提交,编译部署的时候,频率需要得到控制。因为大家使用的都是同一套系统,不能因为你一个人去重启相关的服务,从而影响到其他服务。当时,我就迫切地想开发一套工具,可以在程序运行的时候,直接对程序已有的功能进行调试。后面,我在百度上看到greys的介绍,虽然资料偏少,但是这已经成功引起了我的注意。于是,我就从github上寻找这个工具的相关代码。后面,自己在空闲时间试用了一段时间。经过验证,这是一个值得使用的好工具!所以,我想今天空闲时间把这个工具分享给大家。

二、安装使用

1.下载安装

下载代码:

git clone https://github.com/oldmanpushcart/greys-anatomy.git

切换到bin目录:

cd greys-anatomy/bin/

执行打包命令:
./greys-packages.sh

2.开始使用

2.1 目录介绍

bin目录下有以下这些脚本文件:

ga.sh(greys-attach,我看着就检测是否可以对程序进行在线诊断)
greys.sh(这个是我最经常使用的脚本,检测全靠这个,内嵌gs.sh)
greys-packages.sh(本地编译打包安装,内嵌install-local.sh)
gs.sh(greys-shell,主要是通过一些程序的命令行完成一些操作)
install.sh(程序远程安装的一种方式)
install-local.sh(本地安装)

2.2 正式使用

2.2.1 直接运行  ./greys.sh 【进程号】,就可以对程序进行一些诊断了

2.2.2 支持的命令

2.2.2 具体命令介绍

注意:

1.所有的命令都可以使用【help 命令】获得所有配置信息,比如【help sc】就可以获得sc的用法

2.命令阻塞的时候,可以使用ctrl+d键取消执行

【sc】Search-Class的简写,可以展示所有已加载的Class信息

【用法】sc

class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
[d] 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、类加载器等详细信息。
[f] 输出当前类的成员变量信息
[E] 支持正则表达式匹配

【例子】

搜索类:

查看类明细:

【sm】Search-Method的简写,可以展示所有已经加载Class下的方法信息

【用法】sm

class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
[d] 展示每个方法的详细信息
[E] 支持正则表达式匹配

【例子】

搜索方法:

查看方法明细:

【monitor】可以对方法进行监控

【用法】monitor

c统计周期(单位:秒),默认值为120秒

【说明】

Affect(class-cnt:1 , method-cnt:1) cost in 24 ms.  == 这句说明有对我们程序的类和方法进行增强。如果cnt=0,说明增强失败了。

结果信息有:

timestamp 时间戳
class Java类
method 方法(构造方法、普通方法)
total 调用次数
success 成功次数
fail 失败次数
rt 平均RT
fail-rate 失败率

【例子】

监控成功/失败次数:

【watch】可以查看方法的输入、输出、异常情况

【用法】watch

class-pattern类名表达式匹配

method-pattern方法名表达式匹配

condition-express条件表达式

express观察表达式

[b]在**方法调用之前**观察

[e]在**方法异常之后**观察

[s]在**方法返回之后**观察

[f]在**方法结束之后**(正常返回和异常返回)观察

【例子】

查看输入参数:

查看输出结果:

【tt】记录时间,方法耗时,是否返回,是否异常等信息

【用法】tt

class-pattern类名表达式匹配

method-pattern方法名表达式匹配

condition-express条件表达式

n 执行次数

【说明】

INDEX时间片段记录编号,每一个编号代表着一次调用,后续tt还有很多命令都是基于此编号指定记录操作,非常重要。

PROCESS-ID过程编号,我们认为同一个线程的一次同步调用为一个过程

TIMESTAMP方法执行的本机时间,记录了这个时间片段所发生的本机时间

COST(ms)方法执行的耗时

IS-RET方法是否以正常返回的形式结束

IS-EXP方法是否以抛异常的形式结束

OBJECT执行对象的hashCode(),注意,曾经有人误认为是对象在JVM中的无力内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体

CLASS执行的类名

METHOD执行的方法名

【例子】

统计方法耗时:

【stack】打印调用的堆栈信息

【用法】stack

class-pattern类名表达式匹配

method-pattern方法名表达式匹配

condition-express条件表达式

[n:]命令执行次数

[E]支持正则表达式匹配

【例子】

打印方法的堆栈信息

p

【ptrace】打印方法的详细执行过程

【用法】ptrace

class-pattern类名表达式匹配

method-pattern方法名表达式匹配

condition-express条件表达式

[t]记录下渲染路径上所有方法的入参与返回值,记录下的返回值可以与tt命令联动

[n:]命令执行次数

[E]支持正则表达式匹配

[path:]渲染路径表达式匹配,该参数可多次使用

[Epath:]正则表达式渲染路径表达式匹配,该参数可多次使用

【例子】

打印方法的详细执行过程:

【trace】打印方法的详细执行过程

【用法】trace

class-pattern类名表达式匹配

method-pattern方法名表达式匹配

condition-express条件表达式

[n:]命令执行次数

[E]支持正则表达式匹配

...

【例子】

打印概要执行过程:

【session】查看会话信息

【用法】session

【例子】

查看会话信息:

【version】查看版本信息

【用法】version

【例子】

查看版本信息:

【jvm】查看JVM信息

【用法】jvm

【例子】

查看JVM信息

【top】查看线程占用的cpu信息

【用法】top

【例子】

查看线程占用的cpu信息:

【reset】重置增强类

【用法】reset

【例子】

重置增强类:

【quit】退出控制台【shutdown】删除并退出控制台

【用法】quit/shutdown

【例子】

退出控制台:

关闭并退出控制台:

3 使用不足之处

3.1 回格键(Backspace)无法识别,经常输入错误,无法回删命令;

3.2 方向键使用上一条命令还不够人性化,经常很多命令杂在一起显示;

3.3 如果一个类被增强,则会出现多个诊断结果(类本身+增强后的类)。

以上是我的使用介绍,谢谢观看。下次出一篇源码解析,欢迎继续关注!

最新文章

  1. 输入URL到展现页面的全过程
  2. Java课程设计——扫雷(winmine)
  3. 1627. Join
  4. 20145337《JAVA程序设计》第一周学习总结
  5. Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 排序、筛选、分页以及分组
  6. [转] linux中巧用ctrl-z后台运行程序
  7. plist 读取 swift
  8. 记个maven无法识别JAVA_HOME的问题 Error: JAVA_HOME is not defined correctly.
  9. 【转】GitHub平台最火的iOS开源项目——2013-08-25 17
  10. WCF 接收我服务的 HTTP 响应时发生错误
  11. svn 问题汇总
  12. 转:Javascript继承机制的设计思想
  13. Android:assests和raw的区别
  14. CodeForces 621C Wet Shark and Flowers
  15. UML 解析
  16. Gradle 使用笔记
  17. java itext替换PDF中的文本
  18. JavaScript 原型链学习(二)原型的动态性
  19. 组件自定义事件(.sync)实例
  20. JavaScript学习 - 基础(八) - DOM 节点 添加/删除/修改/属性值操作

热门文章

  1. 手把手教你搭建自己的Angular组件库 - DevUI
  2. 关于SpringBoot结合mybatis后遇到的坑
  3. [VSC] HTML打叹号无法自动提示默认框架
  4. IE 兼容问题笔记
  5. 【小技巧】Windows 小技巧
  6. 【Springboot】FastJson与Jackson全局序列化方式的配置和相关工具类
  7. Android平台的so注入--LibInject
  8. LA3177长城守卫
  9. 逆向 string.h 函数库 memset、strcpy、strcmp 函数
  10. aspnetcore 应用 接入Keycloak快速上手指南