【问题标题】:Can clang generate a call graph for an Xcode project (in Objective-C?clang 可以为 Xcode 项目生成调用图(在 Objective-C 中?
【发布时间】:2012-02-23 08:35:12
【问题描述】:

我发现this example 看起来像是输出了我想要的 C++ 内容。 Xcode项目中的Objective-C代码怎么做?

我看到提到 Doxygen 能够创建调用图,但我找不到示例。

(我想更好地了解clang,但是很难入门……)

【问题讨论】:

    标签: objective-c xcode clang call-graph


    【解决方案1】:

    当然。您需要了解一些技巧,但还不错。

    首先,您需要一个兼容版本的opt,因为它不随 Apple 提供的 LLVM 提供。我从 macports 得到了我的:

    port install llvm-3.0
    

    然后你需要编译你的文件。计算参数有时会有点痛苦。最简单的方法是让 Xcode 构建它,然后转到日志并剪切并粘贴巨大的构建行。我以前可以手动破解这些,但我太懒了......

    取出最后一个-o参数(方便在编译行末尾),代入:

    -S -emit-llvm -o - | opt-mp-3.0 -analyze -dot-callgraph
    

    然后,和另一个例子一样:

    $ dot -Tpng -ocallgraph.png callgraph.dot
    

    请记住,在 ObjC 中,有一些函数会被大量调用,而您几乎从不关心这些函数。特别是几乎所有以objc_ 开头的东西。幸运的是,DOT 格式是一个非常简单的文本文件,并且很容易编写后处理脚本来删除您不想要的内容。

    如果您想进一步处理,还有一个-print-callgraph 参数会以稍微不同的格式输出此信息。

    【讨论】:

    • 我已经创建了点图文件。 dot 命令是什么?是clang的一部分还是我必须单独安装?
    • dot 是 graphviz 的一部分。来自 Macports:'sudo port install graphviz'
    • 我需要把方法名翻译成described here吗?
    • 没有。 Objective-C 不会破坏它的名字。更重要的是,clang 是 ObjC 感知的(考虑到谁写了很多,这并不奇怪),所以它呈现的是 ObjC 方法签名,而不是底层的实现函数。请记住,ObjC 是动态的,因此有很多方法可以调用不会出现在任何静态分析中的事物,但您会得到您可能期望的大部分内容。
    • 它缩小了我的图像,因为它对于开罗来说太大了。 (我在一个“问题”文件上运行它,所以这并不是一个巨大的惊喜。)有什么实用的方法可以将它修剪成更小的东西吗?例如,我没有意识到整个图表是水平的,我希望有一些更容易阅读的东西。还是我只需要修剪.dot 文件(或在运行clang 之前过滤ObjC 文件?)
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2013-08-06
    • 1970-01-01
    相关资源
    最近更新 更多