Btrace

入門

攔截方法

* 普通方法 @OnMethod(clazz="", method="")
* 構(gòu)造函數(shù) @OnMethod(clazz="", method="<init>")
* 攔截同名函數(shù)顶捷,用參數(shù)區(qū)分

攔截時機(jī)

* Kind.ENTRY: 入口夷蚊,默認(rèn)值
* Kind.RETURN: 返回
* Kind.THROW: 異常
* Kind.Line: 行

攔截this硼啤,參數(shù),返回值

* this: @Self
* 入?yún)? 可以用AnyType但壮,也可以用真實(shí)類型浦译,同名的用真實(shí)的
* 返回: @Return

獲取對象的值

* 簡單類型: 直接獲取
* 復(fù)雜類型: 反射,類名+屬性名

其他

* 打印行號: Kind.LINE
* 打印堆棧: Threads.jstack()
* 打印環(huán)境變量
/**
 * @author zhoucong04
 * @date 2018/12/23.
 */
@RestController
@RequestMapping("/hello")
public class HelloController {

    @GetMapping("/v1")
    @ResponseBody
    public String index(@RequestParam("name") String username) {
        return "hello," + username;
    }

    @GetMapping("/user")
    @ResponseBody
    public User get(User user) {
        return user;
    }

    @GetMapping("/hi1")
    @ResponseBody
    public String welcome(@RequestParam("name") String name, @RequestParam("id") int id) {
        return name + "," + id;
    }

    @GetMapping("/hi2")
    @ResponseBody
    public String welcome(@RequestParam("name") String name) {
        return name;
    }

    @GetMapping("/exception")
    @ResponseBody
    public String save() {
        try {
            System.out.println("start....");
            System.out.println(1 / 0);
            System.out.println("end....");
        } catch (Exception e) {
        }
        return "success";
    }
}
@BTrace
public class Arg {

    @OnMethod(
            clazz = "com.le.controller.HelloController",
            method = "index",
            location = @Location(Kind.ENTRY)
    )
    public static void anyRead(@ProbeClassName String className, @ProbeMethodName String methodName, AnyType[] args) {
        BTraceUtils.println(className);
        BTraceUtils.println(methodName);
        BTraceUtils.printArray(args);
    }
}
@BTrace
public class Constructor {

    @OnMethod(
            clazz = "com.le.model.User",
            method = "<init>",
            location = @Location(Kind.ENTRY)
    )
    public static void construct(@ProbeClassName String className, @ProbeMethodName String methodName, AnyType[] args) {
        BTraceUtils.println(className);
        BTraceUtils.println(methodName);
        BTraceUtils.printArray(args);
    }
}
@BTrace
public class Same {

    @OnMethod(
            clazz = "com.le.controller.HelloController",
            method = "welcome",
            location = @Location(Kind.ENTRY)
    )
    public static void hihihihi(@ProbeClassName String className, @ProbeMethodName String methodName, String name, int id) {
        BTraceUtils.println(className);
        BTraceUtils.println(methodName);
        BTraceUtils.println(name + " ~ " + id);
    }
}
@BTrace
public class Return {

    @OnMethod(
            clazz = "com.le.controller.HelloController",
            method = "index",
            location = @Location(Kind.RETURN)
    )
    public static void hi(@ProbeClassName String className, @ProbeMethodName String methodName, @com.sun.btrace.annotations.Return AnyType arg) {
        BTraceUtils.println(className);
        BTraceUtils.println(methodName);
        BTraceUtils.println(arg);

    }
}
@BTrace
public class Line {

    @OnMethod(
            clazz = "com.le.controller.HelloController",
            method = "save",
            location = @Location(value = Kind.LINE, line = 42)
    )
    public static void printLine(@ProbeClassName String className, @ProbeMethodName String methodName, int line) {
        BTraceUtils.println(className);
        BTraceUtils.println(methodName);
        BTraceUtils.println(line);
    }
}
@BTrace
public class OnThrow {

    @TLS
    static Throwable currentException;

    @OnMethod(
            clazz = "java.lang.Throwable",
            method = "<init>"
    )
    public static void onthrow(@Self Throwable self) {
        currentException = self;
    }

    @OnMethod(
            clazz = "java.lang.Throwable",
            method = "<init>"
    )
    public static void onthrow1(@Self Throwable self, String s) {
        currentException = self;
    }

    @OnMethod(
            clazz = "java.lang.Throwable",
            method = "<init>"
    )
    public static void onthrow1(@Self Throwable self, String s, Throwable cause) {
        currentException = self;
    }

    @OnMethod(
            clazz = "java.lang.Throwable",
            method = "<init>"
    )
    public static void onthrow2(@Self Throwable self, Throwable cause) {
        currentException = self;
    }

    @OnMethod(
            clazz = "java.lang.Throwable",
            method = "<init>",
            location = @Location(Kind.RETURN)
    )
    public static void onthrowreturn() {
        if (currentException != null) {
            BTraceUtils.Threads.jstack(currentException);
            BTraceUtils.println("=====================");
            currentException = null;
        }
    }
}
@BTrace
public class ArgComplex {

    @OnMethod(
            clazz = "com.zc.controller.HelloController",
            method = "get",
            location = @Location(Kind.ENTRY)
    )
    public static void anyRead(@ProbeClassName String className, @ProbeMethodName String methodName, User user) {
        BTraceUtils.printFields(user);
        Field name = BTraceUtils.field("com.le.model.User", "name");
        BTraceUtils.println(BTraceUtils.get(name, user));
        BTraceUtils.println(className);
        BTraceUtils.println(methodName);
    }
}
@BTrace
public class JInfo {
    static {
        BTraceUtils.println("System.Properties:");
        BTraceUtils.printProperties();
        BTraceUtils.println("VM Flags:");
        BTraceUtils.printVmArguments();
        BTraceUtils.println("OS Enviroment:");
        BTraceUtils.printEnv();
        BTraceUtils.exit(0);
    }
}

參考

https://github.com/btraceio/btrace/tree/master/samples
http://calvin1978.blogcn.com/articles/btrace1.html
http://www.reibang.com/p/cff037edb750
https://blog.csdn.net/ZYC88888/article/details/81662671
http://blog.51cto.com/zero01/2143096
http://www.cnblogs.com/laoxia/p/9773319.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甘有,一起剝皮案震驚了整個濱河市诉儒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌亏掀,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泛释,死亡現(xiàn)場離奇詭異滤愕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)怜校,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門间影,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茄茁,你說我怎么就攤上這事魂贬」睿” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵付燥,是天一觀的道長宣谈。 經(jīng)常有香客問我,道長键科,這世上最難降的妖魔是什么闻丑? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮勋颖,結(jié)果婚禮上嗦嗡,老公的妹妹穿的比我還像新娘。我一直安慰自己饭玲,他們只是感情好侥祭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茄厘,像睡著了一般卑硫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚕断,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天欢伏,我揣著相機(jī)與錄音,去河邊找鬼亿乳。 笑死硝拧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的葛假。 我是一名探鬼主播障陶,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼聊训!你這毒婦竟也來了抱究?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤带斑,失蹤者是張志新(化名)和其女友劉穎鼓寺,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勋磕,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妈候,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了挂滓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苦银。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幔虏,到底是詐尸還是另有隱情纺念,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布想括,位于F島的核電站陷谱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏主胧。R本人自食惡果不足惜叭首,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望踪栋。 院中可真熱鬧焙格,春花似錦、人聲如沸夷都。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囤官。三九已至冬阳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間党饮,已是汗流浹背肝陪。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刑顺,地道東北人氯窍。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蹲堂,于是被迫代替她去往敵國和親狼讨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,101評論 1 32
  • 長頸鹿戀愛了柒竞,愛上了海豚小姐 那是個晴朗的午后 飼養(yǎng)員趕著長頸鹿到補(bǔ)給站乘涼 補(bǔ)給站的外面貼這張水族館的海報 海報...
    醉臥風(fēng)雪里_閱讀 329評論 0 0
  • 邊城洪安距重慶秀山縣城二十多公里朽基。幾次到秀山都沒有時間去布隔,而今又來秀山,何不借此機(jī)會去親身感受一下沈從文筆下...
    青梅濁酒閱讀 412評論 3 6
  • 雙勇隊(duì)——樓良勇 刻意練習(xí)訓(xùn)練營開營一周的時間過去了踩晶,感覺上還有點(diǎn)懵执泰,好像是假裝刻意的完成任務(wù),無非也是為了完成任...
    樓良勇閱讀 247評論 0 0
  • 知識總量 + (做事流程 x 個人經(jīng)驗(yàn)) = 你的專業(yè)程度 我經(jīng)常在各種渠道,聽到這樣的抱怨: 我擁有博士學(xué)位茸苇,為...
    盎司昂思閱讀 1,586評論 2 15