天天看點

Arthas watch 方法執行資料觀測

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​

    ​的順序無關