Step1
下载demo-arthas-spring-boot.jar,再用java -jar命令启动:
1
2
3
wget https://github.com/hengyunabc/katacoda-scenarios/raw/master/demo-arthas-spring-boot.jar
java -jar demo-arthas-spring-boot.jar --server.port=1945
下载了jar包,因为该项目默认是80端口,而主机上80端口已经被占用,所以启动时设置了端口号--server.port=1945(2019年4月5日)
Step2
启动"arthas"
1
java -jar arthas-boot.jar --target-ip 0.0.0.0
选择刚才的项目
输入"help"可查看命令
![bac5a4ad120a024034d26c122338de4d.png](https://img-blog.csdnimg.cn/img_convert/bac5a4ad120a024034d26c122338de4d.png)
Step3
sysprop
sysprop 可以打印所有的System Properties信息。
![72a63685e23cca94a5b4945aea02f12c.png](https://img-blog.csdnimg.cn/img_convert/72a63685e23cca94a5b4945aea02f12c.png)
也可以指定单个key: sysprop java.version
也可以通过grep来过滤: sysprop | grep user
可以设置新的value: sysprop testKey testValue
sysenv
sysenv 命令可以获取到环境变量,比如ssh登录的ip等。
![c89cfb071d084de5ca0e435e1400f839.png](https://img-blog.csdnimg.cn/img_convert/c89cfb071d084de5ca0e435e1400f839.png)
jvm
jvm 命令会打印出JVM的各种详细信息。
![edb88b2e0b6afe3ce21f2b8ac3de9add.png](https://img-blog.csdnimg.cn/img_convert/edb88b2e0b6afe3ce21f2b8ac3de9add.png)
dashboard
dashboard 命令可以查看当前系统的实时数据面板,每5s更新一次。
输入 Q 或者 Ctrl+C 可以退出dashboard命令
![c44c31a8ae7d6f1e052ed93b918f6927.png](https://img-blog.csdnimg.cn/img_convert/c44c31a8ae7d6f1e052ed93b918f6927.png)
Step4
Tips
为了更好使用Arthas,下面先介绍Arthas里的一些使用技巧。
help
Arthas里每一个命令都有详细的帮助信息。可以用-h来查看。帮助信息里有EXAMPLES和WIKI链接。
比如:
sysprop -h
![0331328ad961295328b01b4766af73c8.png](https://img-blog.csdnimg.cn/img_convert/0331328ad961295328b01b4766af73c8.png)
自动补全
Arthas支持丰富的自动补全功能,在使用有疑惑时,可以输入Tab来获取更多信息。
比如输入 sysprop java. 之后,再输入Tab,会补全出对应的key:
![cebacaf9835ac97e7a27532776bd3432.png](https://img-blog.csdnimg.cn/img_convert/cebacaf9835ac97e7a27532776bd3432.png)
readline的快捷键支持
Arthas支持常见的命令行快捷键,比如Ctrl + A跳转行首,Ctrl + E跳转行尾。
更多的快捷键可以用 keymap 命令查看。
历史命令的补全
如果想再执行之前的命令,可以在输入一半时,按Up/↑ 或者 Ddown/↓,来匹配到之前的命令。
比如之前执行过sysprop java.version,那么在输入sysprop ja之后,可以输入Up/↑,就会自动补全为sysprop java.version。
如果想查看所有的历史命令,也可以通过 history 命令查看到。
pipeline
Arthas支持在pipeline之后,执行一些简单的命令,比如:
sysprop | grep java
sysprop | wc -l (总共的行)
Step5
sc/sm 查看已加载的类
下面介绍Arthas里查找已加载类的命令。
sc
sc 命令可以查找到所有JVM已经加载到的类。
如果搜索的是接口,还会搜索所有的实现类。比如查看所有的Filter实现类:
sc javax.servlet.Filter
![e10992373d8846a2c3e85dfec2836cd8.png](https://img-blog.csdnimg.cn/img_convert/e10992373d8846a2c3e85dfec2836cd8.png)
通过-d参数,可以打印出类加载的具体信息,很方便查找类加载问题。
sc -d javax.servlet.Filter
sc支持通配,比如搜索所有的StringUtils:
sc *StringUtils
sm
sm命令则是查找类的具体函数。比如:
sm java.math.RoundingMode
![42de4567f9ce41ba37cc4018e1a5ac96.png](https://img-blog.csdnimg.cn/img_convert/42de4567f9ce41ba37cc4018e1a5ac96.png)
通过-d参数可以打印函数的具体属性:
sm -d java.math.RoundingMode
![fbcd5ef0d81af0559617df6c8b283290.png](https://img-blog.csdnimg.cn/img_convert/fbcd5ef0d81af0559617df6c8b283290.png)
也可以查找特定的函数,比如查找构造函数:
sm java.math.RoundingMode
![72fb160e0eac3a1e721e9aaf8fa20a97.png](https://img-blog.csdnimg.cn/img_convert/72fb160e0eac3a1e721e9aaf8fa20a97.png)
![1fe02a2faec6205035cbef6c4be0cd32.png](https://img-blog.csdnimg.cn/img_convert/1fe02a2faec6205035cbef6c4be0cd32.png)
Step6
Jad
可以通过 jad 命令来反编译代码:
jad com.example.demo.arthas.user.UserController
![499a859fd6f08a8adb0f78ec650eb50c.png](https://img-blog.csdnimg.cn/img_convert/499a859fd6f08a8adb0f78ec650eb50c.png)
通过--source-only参数可以只打印出在反编译的源代码:
jad --source-only com.example.demo.arthas.user.UserController
![22151b0ae268c81e94025c567144dacf.png](https://img-blog.csdnimg.cn/img_convert/22151b0ae268c81e94025c567144dacf.png)
Step7
Ognl
在Arthas里,有一个单独的ognl命令,可以动态执行代码。
调用static函数
ognl '@java.lang.System@out.println("hello ognl")'
可以检查"demo-arthas-spring-boot.jar "里的进程输出,可以发现打印出了hello ognl。
![65c6a557ee4af4638135dc79668eca69.png](https://img-blog.csdnimg.cn/img_convert/65c6a557ee4af4638135dc79668eca69.png)
获取静态类的静态字段
获取UserController类里的logger字段:
ognl -c 1be6f5c3 @com.example.demo.arthas.user.UserController@logger
![5942ac64d17cdede212b6918f2cfc4d8.png](https://img-blog.csdnimg.cn/img_convert/5942ac64d17cdede212b6918f2cfc4d8.png)
还可以通过-x参数控制返回值的展开层数。比如:
ognl -c 1be6f5c3 -x 2 @com.example.demo.arthas.user.UserController@logger
![9728efac8e9afd0bf14b1a9afa8c3044.png](https://img-blog.csdnimg.cn/img_convert/9728efac8e9afd0bf14b1a9afa8c3044.png)
执行多行表达式,赋值给临时变量,返回一个List
1
ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'
![f861710ab2d89c187b9589679231668d.png](https://img-blog.csdnimg.cn/img_convert/f861710ab2d89c187b9589679231668d.png)
更多
在Arthas里ognl表达式是很重要的功能,在很多命令里都可以使用ognl表达式。
一些更复杂的用法,可以参考:
- OGNL特殊用法请参考:https://github.com/alibaba/arthas/issues/71
- OGNL表达式官方指南:https://commons.apache.org/proper/commons-ognl/language-guide.html