Skip to content
cyberdak edited this page Feb 23, 2018 · 10 revisions

常见问题答疑

安装问题

  1. 安装失败

    $:>curl -sLk http://ompc.oss.aliyuncs.com/greys/install.sh|ksh
    downloading... greys.zip.43678
    download file failed!
    • 问:

      为什么我在安装Greys的时候失败了?

    • 答:

      Greys的安装脚本首先先从阿里云上下载greys.zip,然后进行解压、安装。所以必须要求执行安装脚本的用户必须有对当前目录的写权限,一般出现这个问题,可以检查网络磁盘空间以及当前目录是否有写权限

  2. 安装目录

    • 问:

      如果我在/tmp/目录下执行安装脚本,请问Greys会怎么安装?

    • 答:

      安装在/tmp/greys/目录下,该目录下一共有两个重要文件

      • /tmp/greys/greys.jar
      • /tmp/greys/greys.sh

      其中greys.jar为greys的程序主体,启动类、加载类都在这个jar包当中。greys.sh为一个可执行脚本,为Greys的入口。

  3. 如何删除

    • 问:

      安装的Greys如何进行删除?

    • 答:

      Greys是一个绿色环保软件,不会修改你的注册表,也不会在$HOME目录下偷偷创建什么隐藏文件,你需要的就是直接删除。

启动问题

  1. 启动报Operation not permitted错误

    • 问:

      我在启动Greys的时候报这样的错误

      $:> ./greys  11064
      start greys failed, because : Operation not permitted
    • 答:

      Greys要求执行执行启动命令的用户必须拥有和目标进程ID同样的权限(在这个Case中,目标进程ID为11064),否则JVM将无法挂载Greys对应的jar包

  2. 启动报No such process错误

    • 问:

      我在启动Greys的时候报这样的错误

      $:> ./greys  11063
      start greys failed, because : No such process
    • 答:

      目标进程ID不存在。报这样的错误,请核对你的目标进程是否存在。

  3. 启动报Unable to open socket file: target process not responding or HotSpot VM not loaded

    • 问:

    我在启动Greys的时候报这样的错误

    $:> sudo -u admin ./greys  12592
    密码:
    start greys failed, because : Unable to open socket file: target process not responding or HotSpot VM not loaded
    • 答:

      目标进程ID不是JVM进程,或目标JVM进程不支持加载操作,比如低于JDK6的版本等。 一般遇到这种问题一定要非常小心谨慎的执行,如果对方进程编程不严谨,很可能会让对方进程CORE掉。上次我就弄死了个nginx的worker -_-!!

  4. 启动没有响应

    • 问:

      启动之后就什么反应也没有,也没有出现预期的ga?>提示符

    • 答:

      很有可能你的3658端口已经被别的进程占据,请核对你当前机器所开的端口

      netstat -anp|grep LIST

      解决方案也很简单,换个端口

      ./greys.sh [email protected]:6666
  5. sudo -u方式启动报权限不足

    请给你的sudo命令加上-H参数

    sudo -u admin -H ./greys.sh 4567

使用问题

  1. 哪些命令会导致性能问题

    Greys的大部分命令性能开销都非常低廉,当然前提是一次性操作的类不要太多。

  2. 是否能增强由BootstrapClassLoader所加载的类

    当然是可以的,但默认我封印了这个能力。主要是Greys自己也使用了大量BootstrapClassLoader所加载的类,如果处理不好极其容易造成故障。

    你可以通过隐藏命令options激活这个功能

    ga?>options unsafe true
    +--------+--------------+-------------+
    | NAME   | BEFORE-VALUE | AFTER-VALUE |
    +--------+--------------+-------------+
    | unsafe | false        | true        |
    +--------+--------------+-------------+
    Affect(row-cnt:1) cost in 2 ms.
    

    接下来你可以尝试增强系统类了

    ga?>monitor -c 5 java.lang.String substring
    Press Ctrl+D or Ctrl+X to abort.
    Affect(class-cnt:1 , method-cnt:2) cost in 35 ms.
    +---------------------+------------------+-----------+-------+---------+------+------+-----------+
    | timestamp           | class            | method    | total | success | fail | rt   | fail-rate |
    +---------------------+------------------+-----------+-------+---------+------+------+-----------+
    | 2015-06-16 23:44:54 | java.lang.String | substring | 30    | 30      | 0    | 0.23 | 0.00%     |
    +---------------------+------------------+-----------+-------+---------+------+------+-----------+
    

    但我话就放在这里,随意增强系统类。后果自负!

其他问题

  1. Greys支持将信息输出到文件中么?

    支持,不过要做一些小命令。

    ./greys.sh 4567|tee -a ./greys.log
  2. Greys必须使用在Sun JDK6+的版本么?

    很遗憾抱歉的说,是的。

    Greys的原理和Btrace一样,依赖了JDK6+提供的Instumentation特性,所以必须要求目标的JDK环境是JDK6及其以上的版本

    理论上Greys应该能在各种实现了SUN标准的各种JVM实现中运行,比如JRockitZing等,但我自己没有机会尝试,若有环境能进行测试,我将不胜感激。

    JRE中由于缺少tools.jar,所以无法直接运行Greys,需要稍作一些修改。同样的也没有需求要在JRE中运行Greys,我这里也偷个懒,留给其他有需要的人来实现吧。

  3. 程序中是否有彩蛋?

    有,自己找!