通过规则引擎跟踪Java运行状态的检测工具:Byteman


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 的功能、操作方式和使用方式的完整描述,包括所有可用的运行时配置选项。