Byteman - 跟踪给定包中的所有类和方法

Lih*_*ini 0 java trace byteman

使用Byteman时,我们必须在规则语法中指定类和方法.如果我想使用Byteman跟踪程序执行怎么办?

示例:执行程序功能时,我不知道正在执行哪些方法.我想在功能执行期间识别被调用的方法.

这是否意味着我要为给定包中每个类的每个方法添加一个规则?或者有没有其他方法来实现这一目标?

小智 6

是的,基本上你需要为你想要追踪的每个方法制定一个规则(尽管有一种简单的方法可以做到这一点 - 见下文).

Byteman故意避免使用通配符模式进行注入的CLASS和METHOD.那是因为使用这些规则会大大降低JVM的速度.

为什么?好吧,每次加载一个类时,Byteman会被问到"你想通过向它注入一些代码来改变这个类吗?".目前,Byteman通过CLASSNAME索引所有加载的规则.因此,回答这个问题涉及哈希表查找(实际上,两个 - 一个是裸名,另一个是包限定名).这意味着没有答案(几乎总是正确的答案)非常快.如果Byteman允许CLASSNAME的模式,那么它就不能依赖于简单的哈希查找.

例如,如果您有类似CLASS组织的模式..Foo和2个类如org.my.app.FooBar和org.my.app.Bletch你如何判断第一个匹配而第二个不匹配?您必须为每个类名尝试每个模式规则的模式匹配.即使单个模式匹配也比散列表查找昂贵得多.如果您使用多个基于模式的规则,那么成本将根据规则的数量而倍增.

那么,你怎么能绕过Byteman的这个限制呢?如果你想要使用很多类+方法,那么我建议你使用一个程序来生成一个规则脚本,其中包含你感兴趣的每个类+方法的规则.编写一个程序来读取包含类似条目的文件

class_name1 method_pattern1 class_name2 method_pattern2...

该文件说我想要检测CLASS class_name1的所有方法,其方法与method_pattern1匹配,依此类推.

只要目标jar在你的类路径中,你就可以使用当前的类加载器按名称加载每个类(调用this.getClass().getClassLoader()来获取类加载器,然后调用classloader.loadClass(class_name)来获得所需的类).使用反射来获取类的方法列表.对于每个方法,如果该方法的名称与对应的method_pattern输出匹配,则为您的脚本文件输出AT ENTRY规则和/或AT EXIT规则.

如果你想看到一些与此类似的代码,请查看作为Byteman源代码的contrib/dtest包.

https://github.com/bytemanproject/byteman/tree/master/contrib/dtest

如果您对Byteman有任何进一步的问题请及其在项目提供的官方Byteman用户论坛上询问他们:

https://developer.jboss.org/en/byteman?view=discussions

问候,

Andrew Dinn(Byteman项目负责人)