【问题标题】:BCI library for Java in CC 语言中用于 Java 的 BCI 库
【发布时间】:2012-07-27 23:07:21
【问题描述】:

我正在寻找用于 C 或 C++ 中 Java 的 BCI(字节码检测)库,以便在 JVMTI agent 中使用。

最好的情况是纯 C 语言中的 ASMBCEL

到目前为止,我发现的最接近的只是 Kelly O'Hair 几年前编写的演示 java_crw_demo,此后一直用于 Sun 的/Oracle 的教程中。

你还知道什么吗?

一些理由:我正在构建一个检测工具来向java.lang.Object 添加一个getter 方法,并在Object 的每个直接子类中重载这个getter。由于这个原因,我不能使用 Java 代理。此外,出于复杂性和速度的原因,我想避免生成辅助 JVM 来执行检测。

【问题讨论】:

  • 这是一个很好的问题,但对你的理由提出警告:你会发现大多数 JVM 不允许你检测 j.l.Object。
  • 是的,它们会以某种有限的方式进行:例如,我应该能够在 HotSpot 中添加 不超过 1 个非静态方法。我不能在那里添加任何非静态字段......因此我不得不求助于上面的方法:在 Object 中本地实现 getter,在子类中实现字段覆盖 getter。 (HotSpot 作为最常用和最优化的一个,是一个很好的基准。)

标签: java c instrumentation jvmti bcel


【解决方案1】:

我很久以前就开始用 C 编写一个,但由于缺乏动力,我没有走多远。 AFAIK 在 C 中没有公开版本,但根据JVM Specification 编写一个简单的版本以满足您的需求应该不会太难。您应该对the class file format 以及the instruction set 上的章节特别感兴趣。

【讨论】:

  • 根据java_crw_demo的作者找到的laundry list of problems,恐怕这太难了——尽管我的目标可能是比Kelly更少的变化。
  • 嗯,这些问题中的大多数都涉及处理原始类文件;理想情况下,您应该将它们解析为一些易于使用的表示形式,例如 BCELASM tree API 尝试这样做。
  • 作为唯一一个完全回复的人,享受积分吧:)
【解决方案2】:

我找到的唯一合理的解决方案是将字节码实际通过管道传输到使用 ASM(或您选择的 BCI 框架)的单独 Java 程序。这并不快,但您只需为每个检测类执行一次。

【讨论】:

猜你喜欢
  • 2018-09-22
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多