什么是BTrace?
BTrace是一個開源項目,始于2007年,最初由A.Sundararajan和K.Balasubramanian兩人擁有。 由于Java One 2008會議,它獲得了名聲。
BTrace幫助我們查明應用程序中的復雜代碼問題。 使用BTrace可以解決的問題包括代碼錯誤,不可預測的流程,并發問題和在特定的且通常難以重現的情況下發生的性能問題。
BTrace以程序員定義的方式動態地(無需重新啟動應用程序)檢測(更改)應用程序的字節碼。 工具的目的是查看在代碼的特定區域中發生的情況。 如果超出此范圍使用,則可能會損害應用程序的流程,因此驗證程序禁止該操作。
例如,讓我們嘗試解決以下問題–重要文件每天偶爾被刪除一次。 我們想要找到執行此操作的代碼。 因此,我們想更改java.io.File的'delete'方法并在文件名合適的情況下打印調用線程的堆棧跟蹤。 使用BTrace,我們可以通過編寫簡短的Java代碼來做到這一點。

在Tar??get JVM中,有一個動態插入的BTrace代理(使用attach API )。 BTrace客戶端(BTrace命令行或具有BTrace插件的Visual VM)將命令發送到代理并獲取響應。 BTrace代理會檢測正在加載到目標JVM中的類,并重新加載已經加載的類。
編寫跟蹤腳本
編寫BTrace腳本非常簡單明了,其概念類似于面向方面的編程概念。
import com.sun.btrace.annotations.*;
import com.sun.btrace.BTraceUtils;@BTrace
public class HelloWorld {@OnMethod(clazz="java.io.File",method="")
public static void onNewFileCreated(String fileName) {BTraceUtils.println("New file is being created");BTraceUtils.println(fileName);
}
每個BTrace腳本均由探針(Aspects lang語中的切入點)和操作(建議)組成。 探針定義何時應執行檢測。 動作定義了檢測。
探針可以包括以下內容:
- 方法進入/退出
- 電話號碼
- 字段已更新/已訪問
- 方法調用/返回(在指定方法內)
- 異常拋出(之前)
- 同步進入/退出
- 計時器
- 構造器入口
BTrace的能力和局限性
能力
- 動態連接到任何Java6 +應用程序并運行any(*)代碼
局限性
- 出于安全考慮,必須與運行跟蹤應用程序的用戶使用同一用戶運行
- 僅支持Hotspot JVM
- 與目標應用程序分開編譯–不熟悉應用程序類
- 可能會破壞目標應用程序–我在壽命很長的設置上運行了BTrace,該設置包含很多跟蹤腳本。 目標應用程序甚至沒有崩潰過。
先進的BTrace
BTrace社區實際上由一個定期在項目上工作的開發人員組成。 因此,不要期望在接下來的版本中有太多的改進和許多新功能。 (這是一個為項目做出貢獻的好機會,因為每個開發人員都會顯著增強開發水平)。
該項目的文檔應該得到顯著改進–我發現自己在將這個框架集成到我現有的框架中時曾多次猜測。 BTrace論壇是獲取有關框架答案的好方法。
為了理解BTrace的魔力是如何工作的,需要三個領域的知識-“ Java代理開發”,“ java中的字節碼操作”和“ Java附加api”。 將來我可能會寫一些這些領域。
相關鏈接
http://www.parleys.com/#st=5&id=1618&sl=1
http://kenai.com/projects/btrace
參考: The Art of Java博客的JCG合作伙伴 Art Gourevitch 對BTrace的介紹 。
翻譯自: https://www.javacodegeeks.com/2012/06/introduction-to-btrace-for-java.html