官方文档很详细,但是有点多,这里介绍下自己常用的,来帮助快速入门,当然更多的还是参考官网

安装

安装很简单,直接下载:

  1. curl -O https://alibaba.github.io/arthas/arthas-boot.jar

启动:

  1. java -jar arthas-boot.jar

使用

watch

有时候某个方法出现问题,但是没有日志,可以使用这个命令,查看该方法的入参和返回值,官网对该命令的介绍

启动后控制台会看到所有的java进程,在控制台输入你要查看的应用编号,我们这里输入数字:4,就可以调试这个应用的信息了
image.png

例如监听controller类中listHandle方法的入参和返回值,注意的是这里要输入完整的类路径

  1. # 执行命令
  2. watch com.demo.controller listHandle "{params,returnObj}" -x 2
  3. # 再次访问该方法,就可以看到控制台输出的详细信息了,以下是控制台的消息
  4. Press Q or Ctrl+C to abort.
  5. Affect(class-cnt:1 , method-cnt:1) cost in 100 ms.
  6. ts=2019-10-24 11:16:09; [cost=139.162383ms] result=@ArrayList[
  7. @Object[][isEmpty=true;size=0],
  8. @ArrayList[
  9. @Depart[Depart(id=4, name=体育部)],
  10. @Depart[Depart(id=2, name=教学部)],
  11. ],
  12. ]

和Java代码的对比,是不是很详细:
image.png

再例如,如果没有日志,想查看某个方法抛出的异常:

  1. # 执行命令
  2. watch com.demo.controller listHandle -e '{throwExp}'
  3. # 访问,可以看到以下报错信息
  4. ts=2019-11-07 22:33:51; [cost=0.285704ms] result=@ArrayList[
  5. java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment
  6. at java.lang.Class.forName0(Native Method)
  7. at java.lang.Class.forName(Class.java:264)
  8. at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:103)
  9. at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
  10. at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1181)
  11. at com.pmzhongguo.ex.core.utils.SCaptcha.createCode(SCaptcha.java:82)
  12. at com.pmzhongguo.ex.core.utils.SCaptcha.<init>(SCaptcha.java:71)
  13. at com.pmzhongguo.ex.framework.controller.CodeController.validateCode(CodeController.java:138)
  14. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  15. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  16. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  17. at java.lang.reflect.Method.invoke(Method.java:498)

jad

反编译指定已加载类的源码。

例子使用,这里反编译 String 这个类,需要完整的类路径,同时也支持正则:

  1. $ jad java.lang.String
  2. ---------------一以下是输出结果:-------------------
  3. ClassLoader:
  4. Location:
  5. /*
  6. * Decompiled with CFR 0_132.
  7. */
  8. package java.lang;
  9. import java.io.ObjectStreamField;
  10. ...
  11. public final class String
  12. implements Serializable,
  13. Comparable<String>,
  14. CharSequence {
  15. private final char[] value;
  16. private int hash;
  17. private static final long serialVersionUID = -6849794470754667710L;
  18. private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];
  19. public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator();
  20. public String(byte[] arrby, int n, int n2) {
  21. String.checkBounds(arrby, n, n2);
  22. this.value = StringCoding.decode(arrby, n, n2);
  23. }
  24. ...