btrace簡介:
btrace是一種動態跟蹤分析一個運行中的Java應用程序的工具,它基於java的探針技術動態地向目標應用程序的字節碼注入追蹤代碼(字節碼追蹤),這些追蹤字節碼追蹤代碼使用Java語言表達,也就是BTrace的腳本
btrace在github上的地址:
https://github.com/btraceio/btrace
編譯好的軟件包的下載地址:
https://github.com/btraceio/btrace/releases
現在(2017年二月)的最新版本是v1.3.9 我們把btrace-bin-1.3.9.zip下載之后解壓到磁盤的某個位置然后配置BTRACE_HOME(比如,如果我們將下載下來的文件解壓到D盤根目錄,就將BTRACE_HOME配置為 D:\btrace-bin-1.3.9),然后將BTRACE_HOME文件夾下的bin目錄配置到path里
假設,我們的目標代碼如下
/*
* Created with Intellij IDEA
* USER: 焦一平
* Mail: jiaoyiping@gmail.com
* Date: 2017/2/5
* Time: 21:24
* To change this template use File | Settings | Editor | File and Code Templates
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Demo {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("please input the first param:");
String p1 = bufferedReader.readLine();
System.out.println("please input the first param:");
String p2 = bufferedReader.readLine();
getResult(Integer.parseInt(p1), Integer.parseInt(p2));
System.out.println("press ENTER TO EXIT ...");
bufferedReader.readLine();
}
public static int getResult(int param1, int param2) {
return param1 * param2;
}
}
監控的代碼如下:
import com.sun.btrace.annotations.*;
@BTrace(unsafe = true)
public class BtraceTest {
@OnMethod(clazz = "Demo", method = "getResult", location = @Location(Kind.RETURN))
public static void getParamAndResultByBtrace(int param1, int param2, @Return int result) {
System.out.println("===========BTrace begin==================");
System.out.println("the first param:" + param1);
System.out.println("the second param:" + param2);
System.out.println("result: " + result);
System.out.println("===========BTrace end====================");
}
}
編譯並運行目標代碼(此時先不要輸入需要的參數,因為監控代碼還未植入),運行jps獲取執行目標代碼的進程id,我們得到pid為9284
cd到BtraceTest.java所在的文件夾,
執行: btrace 9284 BtraceTest.java
此時,監控代碼就被注入到了目標代碼中,我們輸入目標代碼需要的兩個參數之后,會看到,參數和返回結果被輸出了出來: