Arthas在線上debug中解決的10個問題


 

當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:

1. 這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception

使用sc命令可以查看指定類的詳細信息,包括從哪個jar包加載。

 

sc *.OfficeListService -d

 

 

2. 我改的代碼為什么沒有執行到?難道是我沒 commit?分支搞錯了

如果需要確認當前運行的代碼,可以通過jad命令,反編譯出代碼。

 

jad *.OfficeListService queryOfficeUser

 

 

 

 

 

 

 

3. 遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?

arthas有一系列命令可以對線上代碼進行監測。啟動監測后,每當方法被調用就會輸出監測的相關數據。

 

watch命令:對指定方法進行數據觀測,包括入參、返回值和拋出異常。

 

watch *.FormController queryApplyDataDetail -f {params,returnObj} -x2

 

 

 

 

monitor命令:統計指定方法的調用情況,調用次數、成功次數、平均執行時間等

 

monitor -c 5 *.DashboardMetaController queryList

 

 

stack命令:輸出指定方法被調用的路徑。

 

stack *.FormDataService queryDataDetail

 

 

 

 

4. debug時,想在代碼中添加日志,但為一行日志代碼重新發布太麻煩了。

arthas支持代碼熱更新,不需要項目重新發布,只修改需要的代碼,編譯后就可以替換線上正在運行的類。

 

比如現在線上運行的getVersion接口,現在要修改成返回arthas_test_version”。

 

jad命令反編譯出接口所在類的代碼,輸出成文件。

 

jad --source-only com.****.system.rest.system.sys.SysConfigController > ~/arthas_test/SysConfigController.java

 

修改輸出的代碼。

 

 

 

 

sc命令+grep命令,找出類的classLoader的哈希值

 

 

 

sc -d com.****.system.rest.system.sys.SysConfigController | grep classLoaderHash

 

 

 

mc命令將修改后的代碼編譯成class文件。-c后的參數就是找出的classLoader的哈希值。

 

mc -c 7c81d32b ~/arthas_test/SysConfigController.java -d ~/arthas_test

 

 

 

 

 

最后,redefine命令加載新的class文件。

 

redefine ~/arthas_test/com/****/system/rest/system/sys/SysConfigController.class

 

 

 

 

 

再次調用接口,可以看出運行的已經是修改后的代碼。

 

 

 

5. 線上遇到某個用戶的數據處理有問題,但線上同樣無法debug,線下無法重現!

tt命令可以在后台觀測並保存指定方法調用時的參數、返回值、異常等信息,並可以用保存的參數再次調用方法。

 

另外,設置ognl表達式可以讓命令在滿足條件時才保存記錄。例如,出現異常時才保存。

 

tt -t *.FormController queryById "returnObj.contains('\"status\":500')" >> tt_logs.txt  &

 

該命令觀測FormControllerqueryById方法,並且只有在返回值字符串中包含status:500時才記錄。另外,>>符號將調用記錄重定向到tt_logs.txt文件中,&”讓命令在后台執行,關閉終端也能一直運行。

 

接下來進行一次出錯的調用,可以看出tt記錄了這次調用。

 

 

 

 

 

根據編號,查看調用的詳細信息。

 

tt -i 1006

 

 

 

 

另外,可以重放指定編號的調用,顯示第二次調用的結果。

 

tt -i 1006 -p

 

 

 

6. 是否有一個全局視角來查看系統的運行狀況

dashboard命令會顯示當前系統的實時數據面板包括線程、內存、GC、運行時等信息

 

 

 

 

7. 有什么辦法可以監控到JVM的實時運行狀態

除了dashboard命令的數據面板外,還有thread命令可以顯示當前線程信息。

 

 

 

 

可以根據id查看具體線程的堆棧。

thread 187

 

 

 

 

 

8. 怎么快速定位應用的熱點,生成火焰圖

profiler命令可以在一段時間內對數據采樣,生成火焰圖。

 

profiler start --duration 300

 

該命令對cpu進行300秒的采樣。也可以指定對其他數據進行采樣。

 

采樣后生成svghtml格式的火焰圖。

 

 

 

 

9. 怎樣直接從JVM內查找某個類的實例

vmtool命令可以查詢指定類的內存對象。

 

vmtool --action getInstances --className java.lang.String -limit 30

 

該命令查找內存中的String對象,限定前30個。

 

 

 

 

10. 進行性能調優時需要在代碼里添加大量計時器代碼,還要重新部署,太麻煩?

trace命令能記錄指定方法的調用路徑,並統計方法向下一層調用的耗時。

 

trace *DashboardMetaController queryList

 

 

 

 

 

這條監測記錄中可以看出queryList方法調用了CommonService:queryPage方法,耗時18ms,占比最大,因此可以trace這個方法,向下深入,最終找出性能瓶頸。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM