使用 ClassFileTransformer.transform 进行字节码检测

发布于 2024-07-16 20:11:05 字数 679 浏览 4 评论 0原文

我用 premain 方法编写了一个类,并在该方法中添加了一个 ClassFileTransformerInstrumentation (Instrumentation.addTransformer()< /代码>)。

了应用程序

java -javaagent:<path_to_agnet.jar> <application>

我已使用但未调用 ClassFileTransformer.transform() 方法调用 。
我观察到 premain 正在被调用。
我还观察到,如果我调用 Instrumentation.retransformClasses(),则会调用 ClassFileTransformer.transform()
在第一个定义 (Classloader.defineClass()) 中,未调用 transform() 方法。

任何线索可能出了什么问题吗?

注意:如果有任何帮助,我可以发布源代码。

问候, 雷吉夫。

I have written a Class with premain method and inside that method I have added a ClassFileTransformer to Instrumentation (Instrumentation.addTransformer()).

I have invoked a application using

java -javaagent:<path_to_agnet.jar> <application>

However ClassFileTransformer.transform() method is not being invoked.
I have observed that premain is being invoked.
I have also observed that if I call Instrumentation.retransformClasses(), then ClassFileTransformer.transform() is being invoked.
On first definition (Classloader.defineClass()), transform() method is not being invoked.

Any clue what could be wrong?

Note: I can post the source code if that is of any help.

Regards,
Rejeev.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

隐诗 2024-07-23 20:11:05

可能的原因

清单不正确

您是否遵循了所需的所有步骤 定义一个 Instrumentation 类?

特别是“打包”步骤,其中涉及在 JAR 清单中指定一组略有不同的属性:

  • 您必须指定一个 Premain-Class 属性,而不是 Main-Class,该属性给出实现 premain()< 的类的完整类名< /code> 在你的代理中。


Premain-Class: my.package.MyAgentClass
  • 如果您的代理使用任何类库,那么您应该指定 Boot-Class-Path 属性,因为您的检测代理需要其库在引导类加载器中可见。
    如果您不这样做,您可能必须对 JVM 使用古怪的 -Xbootclasspath/a:... 参数。
    命令行参数是让事情顺利进行的一个不错的方法,但从长远来看,您希望使用此属性,因为命令行已经因必须指定 Java 检测代理而不断增长。 最好让它尽可能简单。

  • 最后,还有 Can-Redefine-Classes 属性。
    如果它设置为 true,则 Java 检测代理能够重新定义代理本身使用的类。
    这是一个非常奇怪的情况,而且肯定不会出现太多。

静默异常

Rejeev Divakaran 得到了这个)。

我使用 classBeingRedefine.getName() 来打印类名称。
第一次加载时classBeingRedefinenull

最重要的是转换方法中是否存在未捕获的异常
它会被无声无息地吃掉

Possible causes

.

Incorrect MANIFEST

Did you follow all the steps required to define an Instrumentation class ?

Especially the "packaging" step, which involve specifing a slightly different set of attributes in the JAR’s manifest:

  • Instead of Main-Class, you must specify a Premain-Class attribute that gives the full class-name of the class that implements premain() in your agent.
Premain-Class: my.package.MyAgentClass
  • If your agent uses any class-libraries, then you should specify the Boot-Class-Path attribute, since your instrumentation agent will need its libraries to be visible from the bootstrap classloader.
    If you don’t do this, you will probably have to use the wacky -Xbootclasspath/a:... argument to the JVM.
    The command-line argument is a decent way to get things going, but you want to use this attribute in the long-run, because the command-line is already growing from having to specify the Java instrumentation agent. Might as well keep it as simple as possible.

  • Finally, there is the Can-Redefine-Classes attribute.
    If it is set to true, then the Java instrumentation agent is able to redefine the classes that the agent itself uses.
    This is a pretty odd circumstance, and certainly won’t arise much.

.

Silent Exception

(Rejeev Divakaran got that one).

I was using classBeingRedefined.getName() to print the class name.
classBeingRedefined is null when it is loaded first time.

The bottom line is if there is uncaught exception in transform method.
It will be silently eaten up.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文