【问题标题】:bytecode instrumentation to native java functions本机 java 函数的字节码检测
【发布时间】:2013-12-09 22:12:06
【问题描述】:

我正在使用 asm 对 java 函数进行字节码检测。 有没有办法对 jre 本机函数做同样的事情?也许是一种用 java 函数包装本机函数的方法?

最后我的目的是获取所有使用参数运行的函数的列表。

【问题讨论】:

    标签: java instrumentation


    【解决方案1】:

    由于native 方法是在类文件中声明的,您可以像任何其他方法一样替换它们。棘手的部分是如何调用原始方法。为此,您可以创建另一个 native 方法,该方法将链接到原始 native 代码。

    这必须在加载时发生,因为大多数 JVM 不支持之后添加方法。有一个功能可以帮助您将新的辅助方法链接到原始代码,本机方法前缀documentation of Instrumentation.setNativeMethodPrefix 解释详情。

    【讨论】:

    • 我遇到了这个问题,因为我想包装一些 sun.misc.Unsafe 本机方法。该类被加载得相当早,因此它最初不能用包装的本机定义。我在这里提出了这个:mail.openjdk.java.net/pipermail/serviceability-dev/2015-June/… - 也许有人会有想法。
    • @eckes:检测仅适用于 JNI 方法。一些 JRE native 方法只是内在函数,即 JVM 知道这些方法,并在遇到时用内部操作替换它们的调用。因此,对于此类方法,检测方法本身不起作用,但您可以使用转换器将 invocations 替换为其他代码,而不是修改方法。
    • 同意,检测确实适用于 JNI 方法(通过用前缀版本包装它们)。然而,这在已经加载的类上是不可能的(因为它们不允许在重新定义它们时添加方法)。至少我不知道怎么做。是的,它可能不适用于内在函数,但在我的情况下,Unsafe.allocateMemory() 不是内在函数。
    猜你喜欢
    • 2011-11-11
    • 1970-01-01
    • 2013-08-06
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多