【问题标题】:Is it possible to decouple the code indexing capabilities of Eclipse?是否可以解耦 Eclipse 的代码索引功能?
【发布时间】:2009-11-05 15:18:31
【问题描述】:

我希望为大学课程编写一个静态分析器。为了为该工具提供更多功能,我希望能够查找调用层次结构(就像 Eclipse 中的 Ctrl+Alt+H 一样)。这也必须是一个快速操作,因此可能必须针对索引而不是字节码扫描来进行查找。

但是,我期望编写一个 Eclipse 插件过于雄心勃勃。相反,我宁愿解耦创建代码索引的 Eclipse 部分,并使用库进行查找。用户界面将在命令行上,以简化实现。

我了解到 Eclipse 使用 Lucene 进行索引[1],但是,为了 Eclipse 允许的功能,必须在 Lucene 上进行大量工作。

问题是,是否可以将 Eclipse 的索引功能解耦以便重用?如果没有,是否有其他现成的可用库可以进行我讨论过的那种处理?

[1] Lucene In Action (IIRC)


编辑

我认为有一些误解。我不想检查类层次结构,我想检查 call 层次结构。这就是为什么搜索和索引(某种形式,尽管这可能不是正确的术语)进入讨论的原因。检查类层次结构可能比检查调用层次结构要便宜得多。

至于编写 Eclipse 插件,是的,我很乐意,但鉴于这项任务的时间很短,我可能不太可能完成它。但这是有用的信息,你们中的一些人认为这并不像我想象的那么难。

也许我过分强调 Eclipse,我突然想到,我真的在寻找任何提供 API 以通过字节码检查调用图的工具。

到目前为止,感谢您的回答!

【问题讨论】:

  • - 关于 Eclipse 执行速度如此之快的重要一点,它会创建一次通用索引,然后在类更改时单独更新它。所以我猜想与这个 Eclipse 特性没有什么可分离的。我看不出如何避免初始完整字节码分析,这将构建调用层次结构的索引表(可以保存该表以避免必须扫描您搜索调用层次结构的每种类型)。老实说,除了在非常庞大的代码库上,使用 ASM 进行完整扫描真的很快,花在编写“增量索引器”上的时间不值得,imo。
  • 初始的前期扫描没问题。我更关心的是找到一个能够做到这一点的 API(因为它超出了我的课程范围)。如果初始全扫描是使用 ASM,那很好,我只是想避免写那一点 ;-)

标签: java eclipse indexing static-analysis


【解决方案1】:

遍历字节码一点也不难,也不慢。我们以交互速度对大型 Java 代码项目进行了静态分析。由于您的时间不够,我建议您在 eclipse 中修改调用图查看器插件 [1] 之类的东西。此外,Eclipse 代码很难理解,您最好编写自己的插件,尽可能多地使用 Eclipse 未记录的 API。

[1]http://www.eclipseplugincentral.com/Web_Links-index-req-viewlink-cid-1326.html

【讨论】:

  • 我喜欢这个提议:“尽可能多地使用 Eclipse 的未记录 API”。你是认真的吗?
  • 我做到了。这很耗时,但只要坚持不懈,您就可以做到。
【解决方案2】:

您要查找的操作不完全是索引。完成索引以提供全文搜索。查找给定类的超类几乎不是文本搜索。

您想编写一个使用 JDT 的 Eclipse 插件(相当简单,可能只是几个类)。您将需要编写一个 AST(抽象语法树)访问器,用于分析您的代码。然后,您将能够解析类型并使用 JDT 工具轻松遍历类层次结构。

查看my answer to this question

【讨论】:

  • 请看我的编辑。我不是要解决超类,而是要为特定方法调用图表。干杯。
  • 假设您现在正在检查方法 foo,您是在寻找 foo 调用的所有方法还是调用 foo?有很大的不同。
  • 调用 foo.专门调用构造函数。
【解决方案3】:

我会寻求基于ASM 的解决方案,它将完成艰苦的工作,解决层次结构。 这是一个简单的分析器,它打印给定 Class 的调用层次结构:

public class Analyzer {
    public static void main(String[] args) throws IOException {
        ClassReader classReader;
        ClassNode classNode;
        String fullyQualifiedClassName = args[0];
        String callHierarchy = "";
        while (null != fullyQualifiedClassName) {
            callHierarchy = " > " + fullyQualifiedClassName + callHierarchy;
            classReader = new ClassReader(fullyQualifiedClassName);
            classNode = new ClassNode();
            classReader.accept(classNode, 0);
            if (null != classNode.superName) {
                fullyQualifiedClassName = classNode.superName.replace('/', '.');
            } else {
                fullyQualifiedClassName = null;
            }
        }
        System.out.println(callHierarchy);
    }
}

给定 java.util.TreeMap 作为参数,它会打印

> java.lang.Object > java.util.AbstractMap > java.util.TreeMap

我知道这是字节码分析,但老实说,ASM 速度快如闪电,如果您只需要调用层次结构,扫描不会花费太多时间(没有什么值得注意的 imo)。

希望有帮助:)

【讨论】:

  • 您的示例演示了“类型层次结构”,我正在寻找“调用层次结构”。如,如果方法A调用方法B,我查找B的调用层次结构,它显示方法A。这比类型层次结构更复杂,我认为需要扫描整个代码库。这就是我寻找索引解决方案的原因。除非我误解了什么……
【解决方案4】:

看看 IBM 的 WALA 框架。除此之外,您还可以为您的代码库生成调用图 (CG)。事实上,WALA 中的几乎所有内容都是从构建 CG 开始的。 您可以修改他们的示例并将测试数据替换为您自己的。

【讨论】:

    【解决方案5】:

    这是一个 Eclipse 的 GUI 插件,它提供了调用层次结构的可视化表示。这不是一个列表,而是一个帮助。

    http://www.certiv.net/projects/callgraph.html

    【讨论】:

      【解决方案6】:

      我会完全忽略 Eclipse:它只会分散你的注意力。

      如果您正在执行静态分析,您几乎肯定会想要分析字节码。要查找调用层次结构,请查找 invokeinstanceinvokestaticinvokespecial 字节码(请参阅JVM spec)。这些引用完全限定的类/方法名,您可以使用Map<FuncRef,Set<FuncRef>> 构建调用层次结构,其中FuncRef 是您定义的用于保存方法调用信息的类。

      BCEL 可以帮助您进行字节码扫描。

      但是,您将不得不做更多的工作,尤其是使用 invokeinstance,因为您不知道真正的实例可能是什么。有时您可以向后查看代码以找到分配,但您更有可能是在猜测——这是静态分析的致命弱点。

      【讨论】:

        【解决方案7】:

        你看过ecj吗?它是 eclipse 的编译器部分,被分解到一个单独的项目中。

        或者你可以使用eclipse的JDT部分:http://www.eclipse.org/jdt/core/index.php

        【讨论】:

          【解决方案8】:

          Eclipse 插件真的没那么难;他们需要一点时间来适应,但不会太久。

          考虑将您想要的任何功能添加到 Eclipse IDE。您可以利用其他插件功能(例如 JDT,其中包含您正在寻找的搜索功能)。

          然后您可以提供您的插件供所有 eclipse 用户使用,而不是开发另一个独立工具。

          【讨论】:

            【解决方案9】:

            我怀疑您会发现编写插件(Eclipse 为其设计和记录)比提取本应是内部的位并从中构建其他东西更容易。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-08-22
              • 1970-01-01
              • 2013-01-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多