關於 Java動態追蹤、線上debug的工具使用

這裏使用的工具是 阿里巴巴開源工具 arthas,在這裏做幾個簡單的工具使用說明和示例。

前期準備:

  1. 官方文檔地址:https://alibaba.github.io/arthas/quick-start.html
  2. 測試使用demo(橫雲斷嶺):https://github.com/hengyunabc/spring-boot-inside
  3. 工具:https://github.com/alibaba/arthas/releases

 

開始操作:

我是在windows下操作演示的。linux請參考官方文檔或其他示例

  • 首先:    拉取demo代碼到本地,運行起來。
  • 進入命令窗口 使用jps,可以看到,demo已經運行起來了(如果jps命令無效、不識別,但是java -version生效,就重新配置環境變量,或者將環境變量的相對路徑配置爲絕對路徑)

  • 啓動arthas工具,-jar 方式進行啓動,這裏第四個進程是demo進程,輸入4然後回車

此時工具已經啓動成功。現在可以在命令行模式下操作,也可以通過瀏覽器的方式進行訪問

http://127.0.0.1:8563/

  • arthas 有很好的歷史命令提示功能,通過上下方向鍵進行查找,也可以對輸入前綴命令進行歷史命令補全
  • tab 進行命令補全

 

命令示例演示:

watch

方法執行數據觀測,讓你能方便的觀察到指定方法的調用情況。

能觀察到的範圍爲:返回值拋出異常入參,通過編寫 OGNL 表達式進行對應變量的查看。

watch com.example.demo.arthas.user.UserController * '{params,throwExp}' -e

觀察指定的類(UserController),輸出執行函數的入參和返回結果:
*:所有函數  
params:入參
throwExp:異常

 

通過頁面調用拋出異常方法,可以看到,內部的入參,返回結果和異常信息。

這裏也可以指定將信息輸出到文件中 ,默認文件的保存地址,用戶路徑下logs/arthas-cache

我這裏是windows本地啓動項目:路徑就在項目根路徑

watch com.example.demo.arthas.user.UserController * '{params,throwExp}' -e > exp.log

 redefine

加載外部的.class文件,redefine jvm已加載的類。。

注意, redefine後的原來的類不能恢復,redefine有可能失敗(比如增加了新的field),參考jdk本身的文檔。

 這裏是將代碼變更後編譯新的class文件,替換掉路徑下的原有class文件。然後執行命令對jvm中加載的類進行替換。

redefine E:/EDU-WORKSPACE/spring-boot-inside-master/demo-arthas-spring-boot/target/classes/com/example/demo/arthas/user/UserController.class

ognl  

執行ognl表達式

調用靜態函數,在控制檯進行輸出:

ognl '@[email protected]("hello world")'

查看類內屬性:現在要查看logger實現方式,屬性。

 

ognl '@com.example.demo.arthas.user.UserController@logger'

再此可以看到實現方式是通過logback,日誌級別是空。要找到日誌級別就需要繼續向上。

可以看到路徑在向上走,但是上一級的level還是空,就需要繼續向上,.parent。

到該位置就能看到根節點的日誌級別,下級的日誌級別是集成下來的。

修改日誌level:

獲取logger,然後拿到類中靜態字段DEBUG,setLevel更改日誌級別。

ognl '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'

可以看到,日誌級別已經變更爲debug。(調試完整記得將級別修改回去)

 查看當天日誌使用的是哪個配置文件:

ognl '#[email protected]@getLogger("root").loggerContext.objectMap,#map1.get("CONFIGURATION_WATCH_LIST")'

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章