BTrace自己也是能夠獨立運行的程序,做用是在不中止目標程序運行的前提下,經過HotSpot虛擬機的HotSwap技術動態插入本來不存在的調試代碼。java
好比遇到了咱們的程序出問題,而又沒有足夠的打印語句時,咱們通常的方法是不得不停掉服務,而後修改代碼,增長打印語句,從新編譯從新運行來解決,效率很低。dom
但有了BTrace,咱們須要作的就很簡單了,舉例說明:ide
好比環境上運行着一個簡單程序:函數
package com.huawei.main; import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws Exception { Main test = new Main(); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); for (int i = 0; i < 10; i++) { reader.readLine(); int a = (int) Math.round(Math.random() * 1000); int b = (int) Math.round(Math.random() * 1000); System.out.println(test.add(a, b)); } } public int add(int a, int b) { return a + b; } }
該程序從控制檯中獲取一個輸入,而後生成兩個隨機數,相加後將結果打印出來工具
對於add方法沒有日誌打印,若是想在不改變程序的前提下知道程序運行時add函數的入參和返回值,咱們能夠:學習
1. 在環境上解壓BTrace工具包url
好比解壓到:/opt/eucalyptus/test/目錄下spa
2. 編寫BTrace腳本,對於腳本仍是須要時間學習和實踐的。以下TraceScript.java(注意在Linux下,這個文件應該是ANSI格式,不然會報illegal character: \65279的異常):調試
import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*; @BTrace public class TraceScript { @OnMethod(clazz="com.huawei.main.Main", method="add", location=@Location(Kind.RETURN)) public static void func(int a, int b, @Return int result) { jstack(); println(strcat("para A: ", str(a))); println(strcat("para B: ", str(b))); println(strcat("result: ", str(result))); } }