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

标签 java trace byteman

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

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

这是否意味着我必须为给定包中每个类的每个方法添加一条规则?或者还有其他方法可以实现这一点吗?

最佳答案

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

Byteman 故意避免在其注入(inject)的 CLASS 和 METHOD 中使用通配符模式。这是因为使用这些规则会极大地降低 JVM 的速度。

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

例如,如果您有一个像 CLASS org..Foo 这样的模式和两个像 org.my.app.FooBar 和 org.my.app.Bletch 这样的类,您会如何决定第一个第一个匹配而第二个不匹配?您必须为每个类名的每个模式规则尝试模式匹配。即使是单个模式匹配也比哈希表查找昂贵得多。如果您使用多个基于模式的规则,则成本将根据规则数量成倍增加。

好的,那么如何解决 Byteman 的这个限制呢?如果您想检测大量的类+方法,那么我建议您使用一个程序来生成一个规则脚本,其中包含您感兴趣的每个类+方法的规则。编写一个程序来读取包含诸如

之类的条目的文件

类名1 方法模式1 类名2 方法模式2 。 。 .

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

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

如果您想查看一些代码,其中的代码执行与此类似的操作,请查看 contrib/dtest 包,它是 Byteman 源代码的一部分。

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

如果您对 Byteman 有任何其他疑问,请在项目提供的官方 Byteman 用户论坛上提问:

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

问候,

安德鲁·丁恩 (Byteman 项目负责人)

关于java - Byteman - 跟踪给定包中的所有类和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32101045/

相关文章:

Java 如何使用 Graphics2D 制作抗锯齿线?

java - 如何衡量 Java 程序的性能?

java - byteman 可以在 lambda 上触发规则吗?

Java 数组列表

java - 你能帮我完成我的 Android 添加程序吗?

java - 将类变量存储到数组中?

python - 调试 SCons

trace - 无法使用 SerilogTraceListener 将 Trace.WriteLine 重定向到 Serilog

java - Byteman 阻止 Wildfly 8.1.0 启动?