java之生產故障定位Arthas問題
生產故障定位Arthas
Arthas(阿爾薩斯)能為你做什麼?
Arthas 是Alibaba開源的Java診斷工具,深受開發者喜愛。當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
- 這個類從哪個 jar 包加載的?為什麼會報各種類相關的 Exception?
- 我改的代碼為什麼沒有執行到?難道是我沒 commit?分支搞錯瞭?
- 遇到問題無法在線上 debug,難道隻能通過加日志再重新發佈嗎?
- 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
- 是否有一個全局視角來查看系統的運行狀況?
- 有什麼辦法可以監控到JVM的實時運行狀態?
- 怎麼快速定位應用的熱點,生成火焰圖?
Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。
熟悉C++的同學,應該瞭解GDB調試工具。Arthas就是java版的GDB工具。
如果想瞭解學習,可以按照 這個文檔來 學習實踐
當然,官網 是最好的。
java診斷工具Arthas(watch命令)方法觀察神器
能方便的觀察到指定方法的調用情況。能觀察到的范圍為:返回值、拋出異常、入參。
watch
1、得到要觀察類的類屬性以及值,調用類方法
2、得到類對象的屬性以及值
3、得到方法調用前後的入參、出參值
4、根據調用時長,入參匹配條件,異常情況過濾方法調用情況
參數說明
watch 的參數比較多,主要是因為它能在 4 個不同的場景觀察對象。
參數名稱 | 參數說明 |
---|---|
class-pattern | 類名表達式匹配 |
method-pattern | 方法名表達式匹配 |
express | 觀察表達式,默認值:{params, target, returnObj} |
condition-express | 條件表達式 |
[b] | 在方法調用之前觀察 |
[e] | 在方法異常之後觀察 |
[s] | 在方法返回之後觀察 |
[f] | 在方法結束之後(正常返回和異常返回)觀察 |
[E] | 開啟正則表達式匹配,默認為通配符匹配 |
[x:] | 指定輸出結果的屬性遍歷深度,默認為 1 |
特別說明:
- watch 命令定義瞭4個觀察事件點,即 -b 方法調用前,-e 方法異常後,-s 方法返回後,-f 方法結束後
- 4個觀察事件點 -b、-e、-s 默認關閉,-f 默認打開,當指定觀察點被打開後,在相應事件點會對觀察表達式進行求值並輸出
- 這裡要註意方法入參和方法出參的區別,有可能在中間被修改導致前後不一致,除瞭 -b 事件點 params 代表方法入參外,其餘事件都代表方法出參
- 當使用 -b 時,由於觀察事件點是在方法調用前,此時返回值或異常均不存在
- 在watch命令的結果裡,會打印出location信息。location有三種可能值:AtEnter,AtExit,AtExceptionExit。對應函數入口,函數正常return,函數拋出異常。
1、觀察方法入參
watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b
執行結果如下圖所示
result中的Object數組為入參,類型為Integer值分別為-198028,-134246,-2551等。
-b表示觀察點為方法調用前。此時方法剛封裝好形參,還沒有進入方法執行體。
2、同時觀察方法調用前和方法返回後
watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2
以上命令可以將調用方法前(-b參數)"{params,target,returnObj}"即入參,this對象和返回參數返回。
可以將調用方法返回後(-s參數)的"{params,target,returnObj}"即入參,this對象和返回參數返回。
如果參數形式為"{params,returnObj}"隻返回入參和回參。
以上所有結果均在result中體現。
- 參數裡-n 2,表示隻執行兩次
- 這裡輸出結果中,第一次輸出的是方法調用前的觀察表達式的結果,第二次輸出的是方法返回後的表達式的結果
- 結果的輸出順序和事件發生的先後順序一致,和命令中 -s -b 的順序無關
3、 調整-x的值,觀察具體的方法參數值
watch demo.MathGame primeFactors "{params,target,returnObj}" -x 3 -b -s -n 2
-x表示遍歷深度,可以調整來打印具體的參數和結果內容,默認值是1。
可以看到MathGame類的實例中的屬性和值。
4、入參條件表達式
watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0 -b
過濾出來方法調用前匹配條件為參數>0的入參和this對象,隻有滿足條件的調用才會返回。
5、按照耗時進行過濾
watch demo.MathGame primeFactors '{params, returnObj}' '#cost>2' -x 2
過濾出來時長調用大於2ms的。
6、觀察異常信息
watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2
- -e 表示拋出異常時才觸發
- express中,表示異常信息的變量是throwExp
7、訪問當前對象中的某個屬性
watch demo.MathGame primeFactors 'target.illegalArgumentCount'
8、獲取類的靜態字段、調用類的靜態方法
獲取類的靜態字段
watch demo.MathGame * '{params,@[email protected](100)}' -v -n 1 -x 2
調用類的靜態方法。
參考:arthas官方文檔
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- java random.nextInt的坑及解決
- 自帶IDEA插件的阿裡開源診斷神器Arthas線上項目BUG調試
- Arthas排查Kubernetes中應用頻繁掛掉重啟異常
- 解析Arthas協助排查線上skywalking不可用問題
- 分析講解Java Random類裡的種子問題