btrace

BTrace的最大好處绵咱,是可以通過自己編寫的腳本,獲取應(yīng)用的一切調(diào)用信息恩尾。而不需要不斷地修改代碼弛说,加入System.out.println(), 然后不斷重啟翰意。

下載木人,https://github.com/btraceio/btrace信柿。
解壓后,把bin目錄添加到環(huán)境變量醒第。

這里先創(chuàng)建一個叫HelloWorld的類渔嚷,然后用btrace監(jiān)控它:

package com.tmg.helper;
import java.util.Random;

public class HelloWorld {
    public static void main(String[] args) throws Exception {
        //CaseObject object = new CaseObject();
        while (true) {
            Random random = new Random();
            execute(random.nextInt(5000));
        }
    }

    public static Integer execute(int sleepTime) {
        try {
            Thread.sleep(sleepTime);
        } catch (Exception e) {}
        System.out.println("sleep time is=>"+sleepTime);
        return 0;
    }
}

執(zhí)行程序,每0-5秒稠曼,隨機(jī)循環(huán)一次形病。可以使用jps得到pid霞幅。

btrace腳本:

import static com.sun.btrace.BTraceUtils.println;  
import static com.sun.btrace.BTraceUtils.str;  
import static com.sun.btrace.BTraceUtils.strcat;  
import static com.sun.btrace.BTraceUtils.timeMillis;  
  
import com.sun.btrace.annotations.BTrace;  
import com.sun.btrace.annotations.Kind;  
import com.sun.btrace.annotations.Location;  
import com.sun.btrace.annotations.OnMethod;  
import com.sun.btrace.annotations.ProbeClassName;  
import com.sun.btrace.annotations.ProbeMethodName;  
import com.sun.btrace.annotations.TLS;  

@BTrace
public class TraceHelloWorld {  
      
    @TLS  
    private static long startTime = 0;  
      
    @OnMethod(clazz = "com.tmg.helper.HelloWorld", method = "execute")  
    public static void startMethod(){  
        startTime = timeMillis();  
    }  
      
    @OnMethod(clazz = "com.tmg.helper.HelloWorld", method = "execute", location = @Location(Kind.RETURN))  
    public static void endMethod(){  
        println(strcat("the class method execute time=>", str(timeMillis()-startTime)));  
        println("-------------------------------------------");  
    }  
      
    @OnMethod(clazz = "com.tmg.helper.HelloWorld", method = "execute", location = @Location(Kind.RETURN))  
    public static void traceExecute(@ProbeClassName String name,@ProbeMethodName String method,int sleepTime){  
        println(strcat("the class name=>", name));  
        println(strcat("the class method=>", method));  
        println(strcat("the class method params=>", str(sleepTime)));  
          
    }  
}

這時在btrace腳本目錄下執(zhí)行btrace <pid> TraceHelloWorld.java就可以監(jiān)控HelloWorld.java漠吻。


如果還想監(jiān)控其他內(nèi)容,直接修改TraceHelloWorld.java司恳,再執(zhí)行一次btrace命令就可以了途乃,不需要重啟應(yīng)用。結(jié)果輸出到文件./btrace -o mylog $pid HelloWorld.java但首先抵赢,這個mylog會生成在應(yīng)用的啟動目錄欺劳,而不是btrace的啟動目錄。其次铅鲤,執(zhí)行過一次-o之后划提,再執(zhí)行btrace不加-o 也不會再輸出回console,直到應(yīng)用重啟為止邢享。所以推薦直接用轉(zhuǎn)向:./btrace $pid HelloWorld.java > mylog薇溃。

注意事項:
為了避免Btrace腳本的消耗過大影響真正業(yè)務(wù)辕宏,所以定義了一系列不允許的事情:比如不允許調(diào)用任何類的任何方法,只能調(diào)用BTraceUtils 里的一系列方法和腳本里定義的static方法。 比如不允許創(chuàng)建對象琅锻,比如不允許For 循環(huán)等等,可以用-u 運行在unsafe mode來規(guī)避限制诸老,這個限制的開關(guān)設(shè)置在${BTRACE_HOME}/bin/btrace 腳本中com.sun.btrace.unsafe=true;修改為false即可团南。 但不推薦。
BTrace植入過的代碼插爹,會一直在哄辣,直到應(yīng)用重啟為止。所以即使Btrace推出了赠尾,業(yè)務(wù)函數(shù)每次執(zhí)行時都會多出一次Btrace是否Attach狀態(tài)的判斷力穗。


參考:
http://blog.csdn.net/qyongkang/article/details/6091261
http://calvin1978.blogcn.com/articles/btrace1.html
http://jm.taobao.org/2010/11/11/509/
http://www.pigg.co/btrace-introduction.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市气嫁,隨后出現(xiàn)的幾起案子当窗,更是在濱河造成了極大的恐慌,老刑警劉巖寸宵,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崖面,死亡現(xiàn)場離奇詭異元咙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嘶朱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蛾坯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疏遏,你說我怎么就攤上這事脉课。” “怎么了财异?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵倘零,是天一觀的道長。 經(jīng)常有香客問我戳寸,道長呈驶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任疫鹊,我火速辦了婚禮袖瞻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拆吆。我一直安慰自己聋迎,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布枣耀。 她就那樣靜靜地躺著霉晕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捞奕。 梳的紋絲不亂的頭發(fā)上牺堰,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音颅围,去河邊找鬼伟葫。 笑死,一個胖子當(dāng)著我的面吹牛院促,可吹牛的內(nèi)容都是我干的筏养。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼一疯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了夺姑?” 一聲冷哼從身側(cè)響起墩邀,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盏浙,沒想到半個月后眉睹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荔茬,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年竹海,在試婚紗的時候發(fā)現(xiàn)自己被綠了慕蔚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡斋配,死狀恐怖孔飒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情艰争,我是刑警寧澤坏瞄,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站甩卓,受9級特大地震影響鸠匀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逾柿,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一缀棍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧机错,春花似錦爬范、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痢法,卻和暖如春狱窘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背财搁。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工蘸炸, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尖奔。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓搭儒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親提茁。 傳聞我的和親對象是個殘疾皇子淹禾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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