Java BTrace實戰(1)--BTrace的入門和使用


 

前言:
  對線上的java服務, 往往采用日志進行問題處理和分析. 倘若日志缺乏相關的信息時, 那又該如何處理? 遠程調試會影響服務的正常工作, 修改代碼重新部署的方案其實時性和靈活性難以保證(線上服務的流程繁瑣, 問題追蹤的不確定性), 有沒有兩全的完美方案(不影響正常服務, 又靈活/無侵入性)呢?
  答案是有, 它就是人見人愛, 花見花開的神器BTrace. 那BTrace究竟是這么樣的神器, 為何它只要998(啊呸..., -_-bbb). 好了, 讓我們一步一步的掀起它的紅蓋頭來. 本系列講述BTrace的使用/原理/技巧, 希望對大家有所幫助, 對自己也是種學習經歷.
  本文着重講解Btrace的安裝, 原理和初步使用.

BTrace的原理篇:
  BTrace的首字母B來自於bytecode, 某種程度上透露了其原理. 其能在不影響目標程序運行的前提下, 通過HotSpot虛擬機的HotSwap技術動態插入原本不存在的調試代碼, 其是基於了JDK 6的Instumentation來實現的. 具體的原理介紹, 可以參考博文: Btrace的基本原理

BTrace的安裝:
  BTrace的安裝有兩種方式.
  1). VisualVM的插件形式存在
  VisualVM的BTrace插件安裝, 通過其插件管理器來簡單安裝.

  評注: 具體在VisualVM中: 工具->插件->可用插件, 選擇BTrace WorkBench安裝
  2). 單獨的BTrace命令行工具
  BTrace下載網址: https://kenai.com/projects/btrace/downloads/directory/releases
  btrace-bin的目錄結構如下:
  
  評注: bin為二進制/腳本目錄, docs是api文檔, samples包含btrace的各種例子和說明 

BTrace的使用:
  讓我們來構造一個簡單的java程序, 來作為測試程序.

public class Calculator {

  public int add(int a, int b) {
    return a + b;
  }

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    Calculator roboot = new Calculator();
    while ( scanner.hasNext() ) {
      int a = scanner.nextInt();
      int b = scanner.nextInt();
      int c = roboot.add(a, b);
      System.out.println(
        String.format("%d + %d = %d", a, b, c));
    }
  }

}	

  評注: Calculator類的函數add用於a+b的計算, Scanner用於交互, 從命令行讀入輸入參數.
  接着我們編寫一段BTrace代碼, 用於跟蹤Calculator類的add函數.

import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class TracingScript {
    @OnMethod(
        clazz="mmxf.btrace.test.Calculator", 
        method="add", 
        location=@Location(Kind.RETURN)
    )
    
    public static void func(
            int a, int b, 
            @Return int result) {
        println("trace: =======================");
        jstack();
        println(strcat("a:", str(a)));
        println(strcat("b:", str(b)));
        println(strcat("result:", str(result)));
    }
}

  先借助VisualVM的BTrace插件來完成調試:
  可從VisualVM獲取java的進程, 然后點擊Trace Application, 導入BTrace Script, 點擊運行即可.
  結果如圖所示:
  
  當然我們也可以借助btrace的命令行工具來實現:
  1). 確定java進程的pid
  可借助jps -l來實現
  
  評注: 選取pid為7547的進程id為目標進程
  2). 執行btrace命令
  btrace <pid> <btrace_script>
  
  評注:打印出了堆棧信息, 以及add方法的輸入參數以及函數返回結果 

總結:
  本文只是個開頭, 對btrace的安裝和使用有個初步的認識, 后續的文章會對btrace的概念, 用途和實戰例子進行講述. 敬請期待.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM