watch 讓你能友善的觀察到指定方法的調用情況。能觀察到的範圍為:
傳回值
、
抛出異常
、
入參
,通過編寫 OGNL 表達式進行對應變量的檢視。
參數說明
watch 的參數比較多,主要是因為它能在 4 個不同的場景觀察對象
參數名稱 | 參數說明 |
class-pattern | 類名表達式比對 |
method-pattern | 方法名表達式比對 |
express | 觀察表達式 |
condition-express | 條件表達式 |
[b] | 在方法調用之前觀察 |
[e] | 在方法異常之後觀察 |
[s] | 在方法傳回之後觀察 |
[f] | 在方法結束之後(正常傳回和異常傳回)觀察 |
[E] | 開啟正規表達式比對,預設為通配符比對 |
[x:] | 指定輸出結果的屬性周遊深度,預設為 1 |
[n:] | 指令執行次數 |
[#cost:] | 方法執行耗時 |
這裡重點要說明的是觀察表達式,觀察表達式的構成主要由 ognl 表達式組成,是以你可以這樣寫
"{params,returnObj}"
,隻要是一個合法的 ognl 表達式,都能被正常支援。
觀察的次元也比較多,主要展現在參數 advice 的資料結構上。Advice 參數最主要是封裝了通知節點的所有資訊。請參考表達式核心變量中關于該節點的描述。
- 特殊用法請參考:https://github.com/alibaba/arthas/issues/71
- OGNL表達式官網:https://commons.apache.org/proper/commons-ognl/language-guide.html
- watch 指令定義了4個觀察事件點,即
方法調用前,-b
方法異常後,-e
方法傳回後,-s
方法結束後-f
- 4個觀察事件點
、-b
、-e
預設關閉,-s
預設打開,當指定觀察點被打開後,在相應事件點會對觀察表達式進行求值并輸出-f
- 這裡要注意
和方法入參
的差別,有可能在中間被修改導緻前後不一緻,除了 方法出參
事件點 -b
代表方法入參外,其餘事件都代表方法出參params
- 當使用
時,由于觀察事件點是在方法調用前,此時傳回值或異常均不存在-b
同時觀察方法調用前和方法傳回後
$ watch demo.MathGame primeFactors "{params,target,returnObj}" "params[0] instanceof java.lang.Integer" -x 2 -b -s -n 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 46 ms.
ts=2018-12-03 19:29:54; [cost=0.01696ms] result=@ArrayList[
@Object[][
@Integer[1544665400],
],
@MathGame[
random=@Random[java.util.Random@522b408a],
illegalArgumentCount=@Integer[13038],
],
null,
]
ts=2018-12-03 19:29:54; [cost=4.277392ms] result=@ArrayList[
@Object[][
@Integer[1544665400],
],
@MathGame[
random=@Random[java.util.Random@522b408a],
illegalArgumentCount=@Integer[13038],
],
@ArrayList[
@Integer[2],
@Integer[2],
@Integer[2],
@Integer[5],
@Integer[5],
@Integer[73],
@Integer[241],
@Integer[439],
],
]
- 參數裡
,表示隻執行兩次-n 2
- 這裡輸出結果中,第一次輸出的是方法調用前的觀察表達式的結果,第二次輸出的是方法傳回後的表達式的結果
- 結果的輸出順序和事件發生的先後順序一緻,和指令中
的順序無關-s -b