在線調(diào)試工具BTrace使用介紹

1 基本概念

1.1 背景

當程序遇到問題時废离,我們一般怎么去定位廊勃?常見的解決方式都是在本地打斷點進行調(diào)試滑进,或者在測試環(huán)境利用輸出日志進行調(diào)試钢颂,這種方式簡單直接钞它,但過程比較繁瑣,需要重新編譯類文件殊鞭,替換class文件遭垛,重新發(fā)布,重啟應用操灿,還不能保證一次就找到問題的根源锯仪。所以我們就需要在線調(diào)試程序的工具。BTrace就是這樣一款支持在線調(diào)試的工具趾盐。

1.2 定義

BTrace是sun公司推出的一款開源的Java 動態(tài)庶喜、安全追蹤(監(jiān)控)工具,可以在不用重啟應用的情況下監(jiān)控系統(tǒng)運行情況救鲤,方便的獲取程序運行時的數(shù)據(jù)信息久窟,如方法參數(shù)、返回值本缠、全局變量和堆棧信息等斥扛,并且做到最少的侵入,占用最少的系統(tǒng)資源丹锹。

1.3 項目地址

https://github.com/btraceio/btrace

2 使用介紹

  1. 下載安裝BTrace

1) 到github發(fā)布界面下載最新發(fā)布包https://github.com/btraceio/btrace/releases

2) 解壓縮下載的發(fā)布包即可稀颁,解壓縮后文件結(jié)構(gòu)如下:

BTrace解壓縮后文件結(jié)構(gòu)
  1. 編寫調(diào)試腳本

一個簡單的調(diào)試腳本Debug.java如下:

import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.*;

@BTrace
public final class Debug {

   @OnMethod(clazz="com.ssll.Main",method="add",location=@Location(Kind.RETURN))
   public static void test(@ProbeClassName String className,@ProbeMethodName String 
    methodName, int a, int b, @Return int result, @Duration long time) throws Exception {
      BTraceUtils.println("className = " + className + ", methodName = " + methodName);
      BTraceUtils.println("parameter : a= " + a + ", b = " + b);
      BTraceUtils.println("cost time: " + time);
      }
   }

上述腳本的功能為攔截類com.ssll.Main的add()方法队他,并獲取打印當前攔截方法的類名、方法名峻村、方法參數(shù)麸折、方法返回值以及方法執(zhí)行耗時。

類com.ssll.Main的add()方法代碼如下:

 public class Main
{
  public static Random random = new Random();

  public static void main(String[] args) throws Exception {
    new Main().run();
 }

  public void run() throws Exception {
    while (true) {
       add(random.nextInt(10), random.nextInt(10));
      }
   }

  public int add(int a, int b) throws Exception {
     Thread.sleep(random.nextInt(10) * 100);
     return a + b;
  }
}
  1. 運行腳本

1) 獲取當前運行程序的pid粘昨;

2) 在命令行運行btrace <PID> Debug.java

  1. 運行后當程序執(zhí)行add()方法時垢啼,界面輸出如下:
運行腳本界面輸出
  1. 退出在線調(diào)試

1) 在命令行界面按ctrl+c;

ctrl+c退出調(diào)試

2) 輸入1回車张肾,選擇退出

輸入1芭析,然后回車

3) 輸入Y后回車終止批處理操作

3 常用注解說明

通過使用介紹知道整個調(diào)試主要步驟在于BTrace腳本的編寫,BTrace腳本實現(xiàn)的功能主要依賴注解吞瞪,我們來看下BTrace的主要注解馁启。

BTrace總共有兩類注解,一種是在方法上面的注解芍秆,另一種是在方法參數(shù)里面的注解惯疙,不同注解有著不同的功能。

本章只列舉常用的注解說明妖啥,更全面的注解說明請參考BTrace全面注解說明霉颠。

3.1 常用方法注解

方法注解用來標注腳本的方法。

1.@OnMethod

示例:

@BTrace
public final class Debug {

@OnMethod(clazz="com.ssll.Main",method="add",location=@Location(Kind.RETURN))
   public static void test(@ProbeClassName String className,@ProbeMethodName String 
    methodName, int a, int b, @Return int result, @Duration long time) throws Exception {
      BTraceUtils.println("className = " + className + ", methodName = " + methodName);
      BTraceUtils.println("parameter : a= " + a + ", b = " + b);
      BTraceUtils.println("cost time: " + time);
      }
   }

說明:@OnMethod注解用來指定目標類荆虱、目標方法以及方法中具體位置的注解蒿偎。

參數(shù)說明:

clazz:用來指定目標類,支持正則表達式怀读;

method:用來指定待分析的方法名诉位,支持正則表達式;

location:用來指定待分析方法的具體攔截位置信息菜枷,用@Location注解來指定苍糠,@Location注解常用值如下:

???????????Kind.ENTRY:在進入方法時,調(diào)用Btrace腳本犁跪,此為默認值椿息;

???????????Kind.RETURN:方法執(zhí)行完時歹袁,調(diào)用Btrace腳本坷衍,只有把攔截位置定義為Kind.RETURN,才能獲取方法的返回結(jié)果@Return和執(zhí)行時間@Duration条舔;

???????????Kind.LINE:通過設(shè)置line枫耳,可以監(jiān)控代碼是否執(zhí)行到指定的位置,示例:location=@Location(value=Kind.LINE, line = 20)孟抗;

??????????? Kind.ERROR, Kind.THROW,Kind.CATCH:用于某些異常情況的跟蹤迁杨。

2. @OnTimer

示例:

  @BTrace
  public class Memory {
  @OnTimer(4000)
   public static void printMem() {
      println("Heap:");
      println(Sys.Memory.heapUsage());
      println("Non-Heap:");
      println(Sys.Memory.nonHeapUsage());
  }
}

說明:可以通過@OnTimer注解實現(xiàn)定時執(zhí)行腳本钻心,定時單位為毫秒。上述腳本每過4秒鐘打印應用程序相關(guān)內(nèi)存信息铅协。

3. @OnLowMemory

示例:

 @BTrace 
 public class MemAlerter {
   @OnLowMemory(pool = "Tenured Gen",threshold=6000000)
   public static void onLowMem(MemoryUsage mu) {
      println(mu); 
   }
 }

說明:可以在內(nèi)存超過指定閾值的時候進行相關(guān)操作捷沸。

3.2 常用方法參數(shù)注解

方法參數(shù)注解為標記腳本中方法中的參數(shù)的。

  1. @ProbeClassName:用來標記腳本方法中的參數(shù)狐史,能夠獲取當前攔截方法的類名痒给;

  2. @ProbeMethodName:用來標記腳本方法中的參數(shù),能夠獲取當前攔截的方法名骏全;

  3. @Self:用來標記跟蹤腳本方法中的參數(shù)苍柏,能夠獲取攔截方法運行時的實例,獲取實例后通過反射機制可以獲取對象的各類信息姜贡;

  4. @Return:用來標記跟蹤腳本方法中的參數(shù)试吁,能夠獲取當前攔截的方法的返回值;

  5. @Duration:用來標記跟蹤腳本方法中的參數(shù)楼咳,能夠獲取當前攔截的方法的執(zhí)行時間熄捍;

4 注意事項

  1. BTrace腳本的所有輸出都是輸出到stdout;

  2. 為了保證程序的安全母怜,BTrace對編寫的腳本進行了一些限制治唤,比如不允許在腳本中創(chuàng)建對象,不允許在腳本中拋出異常等糙申,更詳細的限制請參考BTrace使用限制宾添;

  3. 如果我們一定要在腳本中進行創(chuàng)建對象等操作,我們可以關(guān)閉BTrace的安全限制柜裸,在btrace啟動命令腳本中將com.sun.btrace.unsafe的值改為true缕陕,并且在腳本中使用@BTrace(unsafe = true)注解;

  4. 支持熱插拔疙挺,無需重啟應用扛邑,只需關(guān)閉BTrace會話,即可動態(tài)刪除已添加的打印日志等信息铐然;

  5. 使用過程中出現(xiàn)的其他未知異呈弑溃可去github issue中去搜索;

  6. 在線調(diào)試因為BTrace會直接把腳本侵入到運行的代碼中搀暑,所以一定要小心再小心沥阳,確保萬無一失后在執(zhí)行腳本。

5 參考資料

[1] 如何在生產(chǎn)環(huán)境使用Btrace進行調(diào)試.http://www.reibang.com/p/dbb3a8b5c92f

6 寫在最后

聊技術(shù)自点,不止于技術(shù)桐罕。

歡迎大家關(guān)注我的個人公眾號:WU雙,在這里我會與大家分享技術(shù)文章、管理知識以及個人的一些思想感悟功炮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溅潜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子薪伏,更是在濱河造成了極大的恐慌滚澜,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫁怀,死亡現(xiàn)場離奇詭異博秫,居然都是意外死亡,警方通過查閱死者的電腦和手機眶掌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門挡育,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朴爬,你說我怎么就攤上這事即寒。” “怎么了召噩?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵母赵,是天一觀的道長。 經(jīng)常有香客問我具滴,道長凹嘲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任构韵,我火速辦了婚禮周蹭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疲恢。我一直安慰自己凶朗,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布显拳。 她就那樣靜靜地躺著棚愤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杂数。 梳的紋絲不亂的頭發(fā)上宛畦,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音揍移,去河邊找鬼次和。 笑死,一個胖子當著我的面吹牛羊精,可吹牛的內(nèi)容都是我干的斯够。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼喧锦,長吁一口氣:“原來是場噩夢啊……” “哼读规!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起燃少,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤束亏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后阵具,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碍遍,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年阳液,在試婚紗的時候發(fā)現(xiàn)自己被綠了怕敬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡帘皿,死狀恐怖东跪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鹰溜,我是刑警寧澤虽填,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站曹动,受9級特大地震影響斋日,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜墓陈,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一恶守、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贡必,春花似錦熬的、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至理逊,卻和暖如春橡伞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晋被。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工兑徘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人羡洛。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓挂脑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子崭闲,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容