Btrace UserGuide翻譯轉載

原文地址:BTrace用戶手冊<譯>

BTrace(https://btrace.dev.java.net/) 是一個非常不錯的java診斷工具, 最近試著用了一下, 文檔比較少, 主要是看例子吧.

BTrace 中的B表示bytecode, 表明它是在字節碼層面上對代碼進行trace 用來在運行中的java類中注入trace代碼, 并對運行中的目標程序進行熱交換(hotswap)

術語

  • Probe Point 在何處執行trace語句, 這里的"何處"可以是具體的跟蹤地點和執行事件, 在BTrace中通過各種注解來指定
  • Trace Actions or Actions 在何時執行trace語句
  • Action Methods 定義在trace腳本中的trace語句, 具體來說就是腳本中的無返回值靜態方法(1.2之后可以是非靜態方法)

BTrace限制
為了保證trace語句只讀, BTrace對trace腳本有一些限制(比如不能改變被trace代碼中的狀態)

  • BTrace class不能新建類, 新建數組, 拋異常, 捕獲異常
  • 不能調用實例方法以及靜態方法(com.sun.btrace.BTraceUtils除外)
  • 不能將目標程序和對象賦值給BTrace的實例和靜態field
  • 不能定義外部, 內部, 匿名, 本地類
  • 不能有同步塊和方法
  • 不能有循環
  • 不能實現接口, 不能擴展類
  • 不能使用assert語句, 不能使用class字面值

BTrace例子

// import all BTrace annotations  
import com.sun.btrace.annotations.*;  
// import statics from BTraceUtils class  
import static com.sun.btrace.BTraceUtils.*;  
   
// @BTrace annotation tells that this is a BTrace program  
@BTrace  
class HelloWorld {  
    
    // @OnMethod annotation tells where to probe.  
    // In this example, we are interested in entry  
    // into the Thread.start() method.  
    @OnMethod(  
        clazz="java.lang.Thread",  
        method="start"  
    )  
    void func() {  
        sharedMethod(msg);  
    }  
   
   void sharedMethod(String msg) {  
        // println is defined in BTraceUtils  
        println(msg);  
   }  
}  

方法上的注解

  • @com.sun.btrace.annotations.OnMethod 用來指定trace的目標類和方法以及具體位置, 被注解的方法在匹配的方法執行到指定的位置會被調用.
    • "clazz"屬性用來指定目標類名, 可以指定全限定類名, 比如"java.awt.Component", 也可以是正則表達式(表達式必須寫在"http://"中, 比如"/java\.awt\..+/").
    • "method"屬性用來指定被trace的方法. 表達式可以參考自帶的例子(NewComponent.java 和 Classload.java, 關于方法的注解可以參考MultiClass.java). 有時候被trace的類和方法可能也使用了注解. 用法參考自帶例子WebServiceTracker.java.
    • 針對注解也是可以使用正則表達式, 比如像這個"@/com\.acme\..+/ ", 也可以通過指定超類來匹配多個類, 比如"+java.lang.Runnable"可以匹配所有實現了java.lang.Runnable接口的類. 具體參考自帶例子SubtypeTracer.java.
  • @com.sun.btrace.annotations.OnTimer 用來指定時長(ms)執行一次trace. 時長通過"value"屬性指定. 具體參考自帶例子 Histogram.java
  • @com.sun.btrace.annotations.OnError 當trace代碼拋異常時該注解的方法會被執行. 如果同一個trace腳本中其他方法拋異常, 該注解方法也會被執行.
  • @com.sun.btrace.annotations.OnExit 當trace方法調用內置exit(int)方法(用來結束整個trace程序)時, 該注解的方法會被執行. 參考自帶例子ProbeExit.java.
  • @com.sun.btrace.annotations.OnEvent 用來截獲"外部"btrace client觸發的事件, 比如按Ctrl-C 中斷btrace執行時將執行使用了該注解的方法, 該注解的value值為具體事件名稱. 具體參考例子HistoOnEvent.java
  • @com.sun.btrace.annotations.OnLowMemory 當內存超過某個設定值將觸發該注解的方法, 具體參考MemAlerter.java
  • @com.sun.btrace.annotations.OnProbe //我也沒搞明白:(

參數上的注解

  • @com.sun.btrace.annotations.Self 用來指定被trace方法的this, 可參考例子AWTEventTracer.java 和 AllCalls1.java
  • @com.sun.btrace.annotations.Return 用來指定被trace方法的返回值, 可參考例子Classload.java
  • @com.sun.btrace.annotations.ProbeClassName (since 1.1) 用來指定被trace的類名, 可參考例子AllMethods.java
  • @com.sun.btrace.annotations.ProbeMethodName (since 1.1) 用來指定被trace的方法名, 可參考例子WebServiceTracker.java
    o (since 1.2)可以通過注解的fqn boolean屬性來表明是否要獲取全限定方法名
  • @com.sun.btrace.annotations.TargetInstance (since 1.1) 用來指定被trace方法內部被調用到的實例, 可參考例子AllCalls2.java
  • @com.sun.btrace.annotations.TargetMethodOrField (since 1.1) 用來指定被trace方法內部被調用的方法名, 可參考例子AllCalls1.java 合 AllCalls2.java
    o (since 1.2) 可通過注解的fqn boolean屬性來表明是否要獲取全限定方法名
    未被注解的方法參數
    未使用注解的方法參數一般都是用來做方法簽名匹配用的, 他們一般和被trace方法中參數出現的順序一致. 不過他們也可以與注解方法交錯使用, 如果一個參數類型聲明為AnyType[], 則表明它按順序"通吃"方法所有參數. 未注解方法需要與Location結合使用:
    Kind.ENTRY, Kind.RETURN- 被trace方法參數
    Kind.THROW - 拋異常
    Kind.ARRAY_SET, Kind.ARRAY_GET - 數組索引
    Kind.CATCH - 捕獲異常
    Kind.FIELD_SET - 屬性值
    Kind.LINE - 行號
    Kind.NEW - 類名
    Kind.ERROR - 拋異常

屬性上的注解

  • @com.sun.btrace.annotations.Export 該注解的靜態屬性主要用來與jvmstat計數器做關聯. 使用該注解之后, btrace程序就可以向jvmstat客戶端(可以用來統計jvm堆中的內存使用量)暴露trace程序的執行次數, 具體可參考例子ThreadCounter.java
  • @com.sun.btrace.annotations.Property 使用了該注解的trace腳本將作為MBean的一個屬性, 一旦使用該注解, trace腳本就會創建一個MBean并向MBean服務器注冊, 這樣JMX客戶端比如VisualVM, jconsole就可以看到這些BTrace MBean. 如果這些被注解的屬性與被trace程序的屬性關聯, 那么就可以通過VisualVM 和jconsole來查看這些屬性了. 具體可參考例子ThreadCounterBean.java 和 HistogramBean.java.
  • @com.sun.btrace.annotations.TLS 用來將一個腳本變量與一個ThreadLocal變量關聯. 因為ThreadLocal變量是跟線程相關的, 一般用來檢查在同一個線程調用中是否執行到了被trace的方法. 具體可參考例子OnThrow.java 和 WebServiceTracker.java

類上的注解

  • @com.sun.btrace.annotations.DTrace 用來指定btrace腳本與內置在其腳本中的D語言腳本關聯, 具體參考例子DTraceInline.java.
  • @com.sun.btrace.annotations.DTraceRef 用來指定btrace腳本與另一個D語言腳本文件關聯. 具體參考例子DTraceRefDemo.java.
  • @com.sun.btrace.annotations.BTrace 用來指定該java類為一個btrace腳本文件.
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容