官方文档很详细,但是有点多,这里介绍下自己常用的,来帮助快速入门,当然更多的还是参考官网
安装
安装很简单,直接下载:
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.X11GraphicsEnvironment
at 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 String
implements 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);
}
...