通過規則引擎跟蹤Java執行狀態的檢測工具:Byteman

banq發表於2022-02-24

Byteman 是一個工具,可以輕鬆跟蹤、監視和測試 Java 應用程式和 JDK 執行時程式碼的行為。

Byteman的規則引擎使跟蹤程式執行、更改變數和返回您喜歡的語句變得非常容易。

  • 它將 Java 程式碼注入到您的應用程式方法或 Java 執行時方法中,而無需您重新編譯、重新打包甚至重新部署您的應用程式。
  • 注入可以在 JVM 啟動時或啟動後在應用程式仍在執行時執行。
  • 注入的程式碼可以訪問您的任何資料並呼叫任何應用程式方法,包括它們是私有的。您幾乎可以在任何地方注入程式碼,無需提前準備原始原始碼。
  • 甚至可以在應用程式繼續執行時刪除注入的程式碼並重新安裝不同的更改。

 

Byteman 最簡單的用途是注入列印語句來跟蹤您的應用程式正在做什麼,通過程式碼識別控制流並顯示靜態或例項資料的值。這可用於監視或除錯實時部署以及檢測被測程式碼,以確保它已正確執行。

Byteman BMUnit 包將 Byteman 與 JUnit 和 TestNG 整合在一起,使您可以輕鬆地使用 Byteman 來擴充套件單元和整合測試的範圍。BMUnit 很容易整合到 maven 和 ant 專案中。

 

工作原理

Byteman 通過在執行時修改應用程式類的位元組碼來工作。然而,與許多其他位元組碼轉換器不同,它在 Java 級別而不是位元組碼級別上執行。你給 Byteman 一個或多個規則來指定你想要執行的 Java 程式碼,以及你想要注入的應用程式或執行時類的方法中的位置。Byteman 研究如何重寫位元組碼,使其表現得就像原始 Java 程式碼包含您請求的原始碼級別更改一樣。由於 Byteman 只需要訪問位元組碼,這意味著它可以修改源不可用或無法重新編譯的庫程式碼。這甚至包括構成 Java 虛擬機器一部分的 Java 程式碼、String、Thread 等類。所以,

Byteman 使用一種清晰、簡單的指令碼語言,基於稱為事件條件操作 (ECA) 規則的形式來指定原始 Java 程式碼應在何處、何時以及如何進行轉換。一個事件指定了一個觸發點,一個您想要注入程式碼的位置。當執行到達觸發點時,將評估規則的條件,即 Java 布林表示式。僅當條件評估為真時,才會執行規則操作中的 Java 表示式(或表示式序列)。通常,一旦執行了注入的程式碼,就會從觸發點繼續執行。然而,規則動作可能包括返回或丟擲表示式,分別從觸發方法強制正常或異常返回。

Byteman 提供了一套內建的“便利”功能,您可以從規則條件和操作中呼叫這些功能。它們允許您執行範圍廣泛的有用操作,從簡單的訊息輸出或堆疊轉儲到複雜錯誤流的傳播,其中多個規則在應用程式的不同部分引入協調操作。

但是,您不僅限於這些標準的內建操作。只要它們引用的類和例項在注入點的範圍內,您就可以將任何 Java 表示式注入到您的應用程式中。您還可以通過提供 POJO(普通的舊 java 物件)作為外掛來替換或擴充套件可用的內建函式。

Byteman 將規則程式碼動態連結到目標方法上下文中,在可能的情況下自動推斷值和表示式的型別,並確保生成的程式碼是型別安全的,並且不會破壞由觸發器方法的簽名定義的型別協定。即使是最複雜的測試場景,Byteman 也能輕鬆程式設計。

 

Byteman 4.0.18現在可以在 GNU LGPL 下下載。它需要 JDK 7 或更高版本的 JVM(如果您仍在使用 JDK 6,請使用最新的 3.X 版本)。該版本包括程式設計師指南,也可線上獲得(pdfhtml),它提供了 Byteman 的功能、操作方式和使用方式的完整描述,包括所有可用的執行時配置選項。

 

相關文章