線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

Arthas是Alibaba開源的Java診斷工具,深受開發者喜愛。它採用命令列互動模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。

安裝

為了還原一個真實的線上環境,我們將透過Arthas來對Docker容器中的Java程式進行診斷。

使用arthas-boot,下載對應jar包,下載地址:https://alibaba.github.io/arthas/arthas-boot.jar

將我們的Spring Boot應用mall-tiny-arthas使用Docker容器的方式啟動起來,打包和執行指令碼在專案的src\main\docker目錄下;

將arthas-boot.jar複製到我們應用容器的\目錄下;

docker container cp arthas-boot.jar mall-tiny-arthas:/

進入容器並啟動arthas-boot,直接當做jar包啟動即可;

docker exec -it mall-tiny-arthas /bin/bash
java -jar arthas-boot.jar

啟動成功後,選擇當前需要診斷的Java程式的序列號,這裡是1,就可以開始診斷了;

期間會下載一些所需的檔案,完成後控制檯列印資訊如下,至此Arthas就安裝啟動完成了。

線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

常用命令

我們先來介紹一些Arthas的常用命令,會結合實際應用來講解,帶大家瞭解下Arthas的使用。

dashboard

使用dashboard命令可以顯示當前系統的實時資料面板,包括執行緒資訊、JVM記憶體資訊及JVM執行時引數。

線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

thread

檢視當前執行緒資訊,檢視執行緒的堆疊,可以找出當前最佔CPU的執行緒。

線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

常用命令:

# 列印當前最忙的3個執行緒的堆疊資訊
thread -n 3
# 檢視ID為1都執行緒的堆疊資訊
thread 1
# 找出當前阻塞其他執行緒的執行緒
thread -b
# 檢視指定狀態的執行緒
thread -state WAITING

sysprop

檢視當前JVM的系統屬性,比如當容器時區與宿主機不一致時,可以使用如下命令檢視時區資訊。

sysprop |grep timezone

user.timezone Asia/Shanghai

sysenv

檢視JVM的環境屬性,比如檢視下我們當前啟用的是什麼環境的Spring Boot配置。

線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

logger

使用logger命令可以檢視日誌資訊,並改變日誌級別,這個命令非常有用。

比如我們在生產環境上一般是不會列印DEBUG級別的日誌的,當我們在線上排查問題時可以臨時開啟DEBUG級別的日誌,幫助我們排查問題,下面介紹下如何操作。

我們的應用預設使用的是INFO級別的日誌,使用logger命令可以檢視;

線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

使用如下命令改變日誌級別為DEBUG,需要使用-c引數指定類載入器的HASH值;

logger -c 21b8d17c --name ROOT --level debug

再使用logger命令檢視,發現ROOT級別日誌已經更改;

線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

使用docker logs -f mall-tiny-arthas命令檢視容器日誌,發現已經列印了DEBUG級別的日誌;

線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

檢視完日誌以後記得要把日誌級別再調回INFO級別。

logger -c 21b8d17c --name ROOT --level info

sc

檢視JVM已載入的類資訊,Search-Class的簡寫,搜尋出所有已經載入到 JVM 中的類資訊。

搜尋com.macro.mall包下所有的類;

sc com.macro.mall.*

線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

列印類的詳細資訊,加入-d引數並指定全限定類名;

sc -d com.macro.mall.tiny.common.api.CommonResult

線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

打印出類的Field資訊,使用-f引數。

sc -d -f com.macro.mall.tiny.common.api.CommonResult

線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

sm

檢視已載入類的方法資訊,Search-Method的簡寫,搜尋出所有已經載入的類的方法資訊。

檢視類中的所有方法;

sm com.macro.mall.tiny.common.api.CommonResult

線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

檢視指定方法資訊,使用-d引數並指定方法名稱;

sm -d com.macro.mall.tiny.common.api.CommonResult getCode

線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

jad

反編譯已載入類的原始碼,覺得線上程式碼和預期不一致,可以反編譯看看。

檢視啟動類的相關資訊,預設會帶有ClassLoader資訊;

jad com.macro.mall.tiny.MallTinyApplication

線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

使用--source-only引數可以只打印類資訊。

jad --source-only com.macro.mall.tiny.MallTinyApplication

線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

mc

記憶體編譯器,Memory Compiler的縮寫,編譯.java檔案生成.class。

redefine

載入外部的.class檔案,覆蓋掉 JVM中已經載入的類。

monitor

實時監控方法執行資訊,可以檢視方法執行成功次時、失敗次數、平均耗時等資訊。

monitor -c 5 com.macro.mall.tiny.controller.PmsBrandController listBrand

watch

方法執行資料觀測,可以觀察方法執行過程中的引數和返回值。

使用如下命令觀察方法執行引數和返回值,-x表示結果屬性遍歷深度。

watch com.macro.mall.tiny.service.impl.PmsBrandServiceImpl listBrand "{params,returnObj}" -x 2

線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器

版權宣告:本文源自 網路, 於,由 楠木軒 整理釋出,共 2452 字。

轉載請註明: 線上專案出BUG沒法除錯?推薦這款阿里開源的診斷神器 - 楠木軒