BTrace入門

簡介
BTrace是一種動態跟蹤分析一個運行中的Java應用程序的工具。BTrace動態地向目標應用程序的字節碼注入追蹤代碼(字節碼追蹤),也就是BTrace腳本。
BTrace腳本和Java差別不大,只是使用了一些annotation來標識某個類是跟蹤腳本。
BTrace應運而生,可以動態地跟蹤java運行程序,將跟蹤字節碼注入到運行類中,對運行代碼侵入較小,對性能上的影響可以忽略不計。被稱爲”線上排查的利器”;
BTrace的最大好處,是可以通過自己編寫的腳本,獲取應用的一切調用信息。而不需要不斷地修改代碼,加入System.out.println(), 然後重啓應用。同時,特別嚴格的約束,保證自己的消耗特別小,只要定義腳本時不作大死,直接在生產環境打開也沒影響。
由於BTrace會把腳本邏輯直接侵入到運行的代碼中,爲了確保信息的安全性,所以在使用上做了很多限制:
1、不能創建新對象、新數組。
2、不能拋出或捕獲異常
3、所有可調用的Btrace方法必須是static public void類型的,所有可調用的Btrace屬性也必須是static類型的
4、不能創建外部類,內部類,嵌套類或本地類
5、不能有同步代碼塊或同步方法,不能使用synchronized關鍵字
6、不能循環(while, for ..)
7、不能實現繼承與接口
8、不能創建斷言與字面量
不恰當的使用BTrace可能導致JVM崩潰,如在BTrace腳本使用錯誤的class文件,所以在上生產環境之前,務必在本地充分的驗證腳本的正確性。
Btrace可以做什麼?
1、接口性能變慢,分析每個方法的耗時情況;
2、當在Map中插入大量數據,分析其擴容情況;
3、分析哪個方法調用了System.gc(),調用棧如何;
4、執行某個方法拋出異常時,分析運行時參數。
參數說明
@OnMethod
Btrace使用@OnMethod註解定義需要分析的方法入口
這裏寫圖片描述
在@OnMethod註解中,需要指定class、method以及location等,class表明需要監控的類,method表明需要監控的方法,指定方式如下:
1、使用全限定名:clazz=”com.metty.rpc.common.BtraceCase”, method=”add”
2、使用正則表達式:clazz=”/javax.swing../”, method=”/./”
3、使用接口:clazz=”+com.ctrip.demo.Filter”, method=”doFilter”
4、使用註解:clazz=”@javax.jws.WebService”, method=”“@javax.jws.WebMethod”
5、如果需要分析構造方法,需要指定method=””

@Location
定義Btrace對方法的攔截位置,通過@Location註解指定,默認爲Kind.ENTRY,Kind.RETURN,Kind.CALL,Kind.LINE和Kind.ERROR, Kind.THROW, Kind.CATCH

BTrace的安裝
  BTrace的安裝方式:VisualVM的插件形式存在
  VisualVM的BTrace插件安裝, 通過其插件管理器來簡單安裝。

工具->插件->可用插件, 選擇BTrace WorkBench安裝。
這裏寫圖片描述
BTrace的簡單使用
被調試代碼
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(c);
}
}
打開jvisualvm,選擇Test程序,鼠標右擊,選擇”Trace application…”。在jvisualvm的文本框中錄入如下代碼。

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

@BTrace
public class TracingScript {
@OnMethod(
clazz=”com.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)));
}
}

勾選”output”,點擊start按鈕。
這裏寫圖片描述

詳細內容見大神整理:
http://www.jianshu.com/p/dbb3a8b5c92f

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章