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。

推薦閱讀: