【问题标题】:How do I catch the read and writes in a java program?如何捕获 Java 程序中的读取和写入?
【发布时间】:2011-07-25 21:25:30
【问题描述】:

我正在尝试创建一个工具,该工具可以捕获 Java 程序进行的所有读写操作。另外,我想知道访问/修改了什么对象的哪些字段。

我目前在看:-

1) java.lang.instrument 我对此无能为力。我无法理解如何编写一个可以访问正在运行的程序并在不同对象/字段和任何相关内容上创建监视的代理。如果您对此有任何想法或信息,我将不胜感激。

2) jvmti 我查看了 jvmti 并尝试创建一个 jvmti 工具,但我发现要获取对象,我需要 JVMTI_EVENT_OBJECT_ALLOC 是一种潜在的能力。但是,我想,事实并非如此。此外,我读到 new 命令不会调用此事件。因此,目前,即使这似乎也不适用。

那么,我想知道你们是否知道用上述方法或您可能知道的任何其他技术/工具来做我想做的事情?

注意:我无权访问应用程序的源代码。所有,我有的是类文件。

【问题讨论】:

  • 类文件是乱码还是可以反编译?
  • 嗨,马特,我将 java 应用程序作为单个 jar 文件。
  • 我的问题更倾向于:你想解决一般问题还是只针对你的特定 jar 文件?
  • 我想解决它,以便我可以将它用于任何应用程序。

标签: java instrumentation jvmti javaagents


【解决方案1】:
【解决方案2】:

使用ASM lib 非常容易。创建一个新的类加载器,在加载所有类之前对其进行检测,并将其用于加载目标类。创建一个新的 MethodAdapter 并覆盖 visitFieldInsn 方法。然后查找PUTFIELDPUTSTATICGETFIELDGETSTATIC 操作码。尽管这看起来很可怕(因为我的解释很可能是胡言乱语),但实际上很容易。只需下载 ASM 手册,您很快就会知道如何操作。

编辑:我忘了告诉你,为了能够拦截 JDK 代码完成的读取和写入,你必须检测这些类,将它们保存到文件并使用修改后的引导类路径运行 JVM,通过命令行参数-Xbootclasspath(java.*和其他一些包;我相信至少sun.*和javax.*也需要这个)。

这对于 AspectJ 也可能是可行的...但我不确定。

【讨论】:

    猜你喜欢
    • 2015-09-04
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多