官方文档很详细,但是有点多,这里介绍下自己常用的,来帮助快速入门,当然更多的还是参考官网
安装
安装很简单,直接下载:
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
启动:
java -jar arthas-boot.jar
使用
watch
有时候某个方法出现问题,但是没有日志,可以使用这个命令,查看该方法的入参和返回值,官网对该命令的介绍。
启动后控制台会看到所有的java进程,在控制台输入你要查看的应用编号,我们这里输入数字:4,就可以调试这个应用的信息了
例如监听controller类中listHandle方法的入参和返回值,注意的是这里要输入完整的类路径
# 执行命令watch com.demo.controller listHandle "{params,returnObj}" -x 2# 再次访问该方法,就可以看到控制台输出的详细信息了,以下是控制台的消息Press Q or Ctrl+C to abort.Affect(class-cnt:1 , method-cnt:1) cost in 100 ms.ts=2019-10-24 11:16:09; [cost=139.162383ms] result=@ArrayList[@Object[][isEmpty=true;size=0],@ArrayList[@Depart[Depart(id=4, name=体育部)],@Depart[Depart(id=2, name=教学部)],],]
和Java代码的对比,是不是很详细:
再例如,如果没有日志,想查看某个方法抛出的异常:
# 执行命令watch com.demo.controller listHandle -e '{throwExp}'# 访问,可以看到以下报错信息ts=2019-11-07 22:33:51; [cost=0.285704ms] result=@ArrayList[java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironmentat java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Class.java:264)at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:103)at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1181)at com.pmzhongguo.ex.core.utils.SCaptcha.createCode(SCaptcha.java:82)at com.pmzhongguo.ex.core.utils.SCaptcha.<init>(SCaptcha.java:71)at com.pmzhongguo.ex.framework.controller.CodeController.validateCode(CodeController.java:138)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)
jad
反编译指定已加载类的源码。
例子使用,这里反编译 String 这个类,需要完整的类路径,同时也支持正则:
$ jad java.lang.String---------------一以下是输出结果:-------------------ClassLoader:Location:/** Decompiled with CFR 0_132.*/package java.lang;import java.io.ObjectStreamField;...public final class Stringimplements Serializable,Comparable<String>,CharSequence {private final char[] value;private int hash;private static final long serialVersionUID = -6849794470754667710L;private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator();public String(byte[] arrby, int n, int n2) {String.checkBounds(arrby, n, n2);this.value = StringCoding.decode(arrby, n, n2);}...
