Step1
下載demo-arthas-spring-boot.jar,再用java -jar命令啟動:
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"
java -jar arthas-boot.jar --target-ip 0.0.0.0
選擇剛才的項目
輸入"help"可查看命令

Step3
sysprop
sysprop 可以打印所有的System Properties信息。

也可以指定單個key: sysprop java.version
也可以通過grep來過濾: sysprop | grep user
可以設置新的value: sysprop testKey testValue
sysenv
sysenv 命令可以獲取到環境變量,比如ssh登錄的ip等。

jvm
jvm 命令會打印出JVM的各種詳細信息。

dashboard
dashboard 命令可以查看當前系統的實時數據面板,每5s更新一次。
輸入 Q 或者 Ctrl+C 可以退出dashboard命令

Step4
Tips
為了更好使用Arthas,下面先介紹Arthas里的一些使用技巧。
help
Arthas里每一個命令都有詳細的幫助信息。可以用-h來查看。幫助信息里有EXAMPLES和WIKI鏈接。
比如:
sysprop -h

自動補全
Arthas支持豐富的自動補全功能,在使用有疑惑時,可以輸入Tab來獲取更多信息。
比如輸入 sysprop java. 之后,再輸入Tab,會補全出對應的key:

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

通過-d參數,可以打印出類加載的具體信息,很方便查找類加載問題。
sc -d javax.servlet.Filter
sc支持通配,比如搜索所有的StringUtils:
sc *StringUtils
sm
sm命令則是查找類的具體函數。比如:
sm java.math.RoundingMode

通過-d參數可以打印函數的具體屬性:
sm -d java.math.RoundingMode

也可以查找特定的函數,比如查找構造函數:
sm java.math.RoundingMode <init>


Step6
Jad
可以通過 jad 命令來反編譯代碼:
jad com.example.demo.arthas.user.UserController

通過--source-only參數可以只打印出在反編譯的源代碼:
jad --source-only com.example.demo.arthas.user.UserController

Step7
Ognl
在Arthas里,有一個單獨的ognl命令,可以動態執行代碼。
調用static函數
ognl '@java.lang.System@out.println("hello ognl")'
可以檢查"demo-arthas-spring-boot.jar "里的進程輸出,可以發現打印出了hello ognl。

獲取靜態類的靜態字段
獲取UserController類里的logger字段:
ognl -c 1be6f5c3 @com.example.demo.arthas.user.UserController@logger

還可以通過-x參數控制返回值的展開層數。比如:
ognl -c 1be6f5c3 -x 2 @com.example.demo.arthas.user.UserController@logger

執行多行表達式,賦值給臨時變量,返回一個List
ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'
更多
在Arthas里ognl表達式是很重要的功能,在很多命令里都可以使用ognl表達式。
一些更復雜的用法,可以參考:
- OGNL特殊用法請參考:https://github.com/alibaba/arthas/issues/71
- OGNL表達式官方指南:https://commons.apache.org/proper/commons-ognl/language-guide.html
Arthas 進階的案例
https://www.cnblogs.com/theRhyme/p/10660287.html
來源:https://alibaba.github.io/arthas/arthas-tutorials?language=cn&id=arthas-advanced
