java之生產故障定位Arthas問題
生產故障定位Arthas
Arthas(阿爾薩斯)能為你做什么?
Arthas 是Alibaba開源的Java診斷工具,深受開發(fā)者喜愛。當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
- 這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
- 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯了?
- 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎?
- 線上遇到某個用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)!
- 是否有一個全局視角來查看系統(tǒng)的運行狀況?
- 有什么辦法可以監(jiān)控到JVM的實時運行狀態(tài)?
- 怎么快速定位應用的熱點,生成火焰圖?
Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。
熟悉C++的同學,應該了解GDB調試工具。Arthas就是java版的GDB工具。
如果想了解學習,可以按照 這個文檔來 學習實踐
當然,官網 是最好的。
java診斷工具Arthas(watch命令)方法觀察神器
能方便的觀察到指定方法的調用情況。能觀察到的范圍為:返回值、拋出異常、入參。
watch
1、得到要觀察類的類屬性以及值,調用類方法
2、得到類對象的屬性以及值
3、得到方法調用前后的入參、出參值
4、根據(jù)調用時長,入參匹配條件,異常情況過濾方法調用情況
參數(shù)說明
watch 的參數(shù)比較多,主要是因為它能在 4 個不同的場景觀察對象。
| 參數(shù)名稱 | 參數(shù)說明 |
|---|---|
| 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 默認打開,當指定觀察點被打開后,在相應事件點會對觀察表達式進行求值并輸出
- 這里要注意方法入參和方法出參的區(qū)別,有可能在中間被修改導致前后不一致,除了 -b 事件點 params 代表方法入參外,其余事件都代表方法出參
- 當使用 -b 時,由于觀察事件點是在方法調用前,此時返回值或異常均不存在
- 在watch命令的結果里,會打印出location信息。location有三種可能值:AtEnter,AtExit,AtExceptionExit。對應函數(shù)入口,函數(shù)正常return,函數(shù)拋出異常。
1、觀察方法入參
watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b
執(zhí)行結果如下圖所示

result中的Object數(shù)組為入參,類型為Integer值分別為-198028,-134246,-2551等。
-b表示觀察點為方法調用前。此時方法剛封裝好形參,還沒有進入方法執(zhí)行體。
2、同時觀察方法調用前和方法返回后
watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2

以上命令可以將調用方法前(-b參數(shù))"{params,target,returnObj}"即入參,this對象和返回參數(shù)返回。
可以將調用方法返回后(-s參數(shù))的"{params,target,returnObj}"即入參,this對象和返回參數(shù)返回。
如果參數(shù)形式為"{params,returnObj}"只返回入參和回參。
以上所有結果均在result中體現(xiàn)。
- 參數(shù)里-n 2,表示只執(zhí)行兩次
- 這里輸出結果中,第一次輸出的是方法調用前的觀察表達式的結果,第二次輸出的是方法返回后的表達式的結果
- 結果的輸出順序和事件發(fā)生的先后順序一致,和命令中 -s -b 的順序無關
3、 調整-x的值,觀察具體的方法參數(shù)值
watch demo.MathGame primeFactors "{params,target,returnObj}" -x 3 -b -s -n 2

-x表示遍歷深度,可以調整來打印具體的參數(shù)和結果內容,默認值是1。
可以看到MathGame類的實例中的屬性和值。
4、入參條件表達式
watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0 -b

過濾出來方法調用前匹配條件為參數(shù)>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 表示拋出異常時才觸發(fā)
- express中,表示異常信息的變量是throwExp
7、訪問當前對象中的某個屬性
watch demo.MathGame primeFactors 'target.illegalArgumentCount'

8、獲取類的靜態(tài)字段、調用類的靜態(tài)方法
獲取類的靜態(tài)字段

watch demo.MathGame * '{params,@demo.MathGame@random.nextInt(100)}' -v -n 1 -x 2
調用類的靜態(tài)方法。
參考:arthas官方文檔
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot+SpringSession+Redis實現(xiàn)session共享及唯一登錄示例
這篇文章主要介紹了SpringBoot+SpringSession+Redis實現(xiàn)session共享及唯一登錄示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04
詳解SpringBoot如何實現(xiàn)多環(huán)境配置
在實際的軟件開發(fā)過程中,一個應用程序通常會有多個環(huán)境,pring?Boot?提供了一個非常靈活和強大的方式來管理這些環(huán)境配置,下面就跟隨小編一起學習一下吧2023-07-07
解決Aop @AfterReturning因返回類型不一致導致無法執(zhí)行切面代碼
這篇文章主要介紹了解決Aop @AfterReturning因返回類型不一致導致無法執(zhí)行切面代碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
SpringBoot使用WebSocket實現(xiàn)向前端推送消息功能
WebSocket協(xié)議是基于TCP的一種新的網絡協(xié)議,它實現(xiàn)了瀏覽器與服務器全雙工(full-duplex)通信——允許服務器主動發(fā)送信息給客戶端,本文給大家介紹了SpringBoot使用WebSocket實現(xiàn)向前端推送消息功能,需要的朋友可以參考下2024-05-05
關于@RequestBody和@RequestParam注解的使用詳解
這篇文章主要介紹了關于@RequestBody和@RequestParam注解的使用詳解,本文十分具有參考意義,希望可以幫助到你,如果有錯誤的地方還望不吝賜教2023-03-03
Springmvc RequestMapping請求實現(xiàn)方法解析
這篇文章主要介紹了Springmvc RequestMapping請求實現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09

