目录
1、watch
2、getstatic
3、trace
4、ongl
相信很多做开发的同学都遇到过这样的问题:程序运行出错,根据返回的错误码定位到了代码中的某一行类、某一个方法。但是苦于没有日志,不知道方法运行的时候传进去的参数是什么,方法的返回值又是什么。而且,是因为在上线的环境中,不可能让你停机去加调试信息。如果你也遇到过这样的问题,那么阿里的这款调试神器可以很好的解决你的问题。
arthas,阿里开源的一款神器,它的功能非常强大,你不需要重启java工程,也不需要修改原来的代码,就可以快速的定位问题。这里我只列出我认为开发中最常用的几项功能,然后举些例子让大家有一个直观的感受。
下载地址:
https://alibaba.github.io/arthas/arthas-boot.jar
常用功能:
1、watch:可用来观察方法出参及返回值,以及另一个好用的功能,就是可以观察当前对象的某个属性
2、getstatic:相当于watch方法的一个补充,可用来观察类的静态属性
3、trace:可以观察方法内部调用路径,并输出方法路径上的每个节点上耗时
4、ognl:可用来调用类的静态方法,以及获取类的静态属性,相当于上面的getstatic
下面来举一些例子来简单说明一下这几个方法的使用。
首先,写一个简单的类:
package com.zhuyun.util;
import java.io.IOException;
public class TestArthas {
public static int i = 2;
public String name;
public static String hello(String s){
System.out.println(s + " world!");
return s + " WORLD!";
}
public String setName(String name){
this.name = name;
return name + " end";
}
public static void main(String[] args) throws IOException {
System.out.println("start ...");
TestArthas testArthas = new TestArthas();
while (true) {
try {
i ++;
Thread.sleep(1000);
testArthas.setName("game");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
然后把它运行起来
然后,用命令java -jar arthas-boot.jar启动 arthas,选中刚才启动的java工程
接下来一个个的测试这些功能。
这里,我们先监控hello()方法的入参以及返回值,输入如下命令:
watch com.zhuyun.util.TestArthas setName "{params,returnObj}" -x 2
结果如下图:
这里可以清楚的看到setName()方法传进来的参数是"game", 返回值是"game end"。
同时用watch方法,还可以监控到当前对象中的属性值,输入如下命令:
watch com.zhuyun.util.TestArthas setName 'target.name'
该方法就是查看当前对象的name的属性值,结果如下:
可以看到,对象的name的属性被赋值为了"game"。
前面watch方法获取的是对象的属性,而getstatic方法则是获取类型静态属性。还是同样的程序,我们在arthas中输入如下命令:
getstatic com.zhuyun.util.TestArthas i
可以获取到静态属性的当前的值。
trace命令可以用来定位方法执行的过程中最耗时的那条操作,同时也可以查看出一个方法执行到了哪一步就没有接继续往下执行了。对于定位问题很有帮助。命令如下:
getstatic com.zhuyun.util.TestArthas setName
这里,我们可以清除的看到代码执行到了哪一行,每一行花费的时间。
这条命令可以让你的程序在运行的过程中,手动的去调用一个类的静态的方法。另外,还可以获取静态类的静态字段,相当于上面的getstatic命令,这里只讲第一个功能。命令如下:
ognl '@com.zhuyun.util.TestArthas@hello("CSDN")'
其中,第一个@后面是类的全路径,第二个@后面是静态方法以及它的参数,结果如下:
我们再来看看控制台
发现它也打印出了“CSDN world!”,说明,我们刚才确实手动的执行了一次hello()的静态方法。