當咱們的線上環境出現問題,而又沒有日誌打印出來時,生產環境又不能遠程debug,這個時候要怎麼辦呢?java
能不能在程序運行的時候查看程序正在執行的入參,出參,執行過程等。Btrace就是一個好用的工具來動態的跟蹤正在運行的Java程序。git
1 下載Btrace,解壓到本地的目錄中。github
wget -c https://github.com/btraceio/btrace/releases/download/v1.3.11.3/btrace-bin-1.3.11.3.tgz
tar -xf btrace-bin-1.3.11.3.tgz -C
mkdir ~/software/btrace
tar -xf btrace-bin-1.3.11.3.tgz -C ~/software/btrace
ls ~/software/btrace
CHANGELOG.md LICENSE README.md bin docs
COPYRIGHT LICENSE-3RD-PARTY.txt THIRDPARTYLICENSEREADME.txt build samples
~/software/btrace/bin/btrace --version
BTrace v.1.3.11.3 (20181217)
複製代碼
2 編寫Btrace腳本,前提是首要要有咱們生產環境的代碼能夠用於trace,首先提供一段生產環境中MVC的代碼。bash
@RequestMapping("/btrace")
@ResponseBody
public Set btraceTest(
String s1,
String s2
){
HashSet<Object> set = new HashSet<>();
set.add(s1);
set.add(s2);
return set;
}
複製代碼
3 導入咱們的Btrace包下的jar包,引入項目,進行使用。app
ls ~/software/btrace/build
btrace-agent.jar btrace-boot.jar btrace-client.jar i386
複製代碼
4 編寫Btrace腳本,以剛纔的MVC 入口爲例。工具
package me.aihe.jmxdemo;
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.*;
import java.util.Set;
@BTrace
public class BtraceDemo {
@OnMethod(clazz = "me.aihe.jmxdemo.JmxdemoApplication", method = "btraceTest", location = @Location(Kind.RETURN))
public static void methodDetail(@Self Object self, String s1, String s2, @Return Set result, @Duration long time) {
BTraceUtils.println();
BTraceUtils.println();
BTraceUtils.println("方法調用棧: ");
BTraceUtils.println("入參1:" + s1 + ",入參2:" + s2);
BTraceUtils.println("返回值: result=" + result);
BTraceUtils.println("時間(ns): " + time);
BTraceUtils.println();
}
}
複製代碼
5 查看咱們正在運行的JVM程序,獲取其PID,而後使用Btrace執行腳本ui
jps
26040 JmxdemoApplication
# 語法:btrace pid btrace腳本位置
~/software/btrace/bin/btrace 26040 /Users/aihe/IdeaProjects/jmxdemo/src/main/java/me/aihe/jmxdemo/BtraceDemo.java
複製代碼
6 還有更多的使用案例,在下載的包中已經有提供:spa
編寫的腳本參數名稱要與咱們代碼中的參數名稱同樣。debug
能夠看到咱們並無修改線上的任何代碼,就能夠直接看到線上代碼正在運行的執行狀況,在排查問題時又增長了一大利器。日誌