使用Byteman时,我们必须在规则语法中指定类和方法。如果我想使用Byteman跟踪程序执行怎么办?
示例:执行程序功能时,我不知道正在执行哪些方法。我想在功能执行期间识别被调用的方法。
这是否意味着我要为给定包中每个类的每个方法添加规则?或者还有其他方法可以达到这个目的吗?
答案 0 :(得分:5)
是的,基本上你需要为你想要追踪的每个方法制定一个规则(尽管有一种简单的方法可以做到这一点 - 见下文)。
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
的问候,
安德鲁丹恩 (Byteman项目负责人)答案 1 :(得分:0)
看起来Byteman不适合你想要的工具。由Understand或JProfiler提供更好的结果。特别是在多线程环境中。