【问题标题】:How to statically dump all ObjC methods called in a Cocoa App?如何静态转储 Cocoa App 中调用的所有 ObjC 方法?
【发布时间】:2012-04-11 06:01:03
【问题描述】:

假设我有一个基于 Cocoa 的 Mac 或 iOS 应用程序。我想在我的应用程序的源代码 我的应用程序的二进制文件上运行一个静态分析器来检索所有Objective-C方法的列表称为。有没有工具可以做到这一点?

几点:

  1. 我正在寻找静态解决方案。我不是在寻找dynamic solution

  2. 可以针对二进制或源代码运行的东西是可以接受的。

  3. 理想情况下,输出只是一个庞大的去重的 Objective-C 方法列表,例如:

    … -[MyClass 富] … +[NSMutableString stringWithCapacity:] … -[NSString 长度] … (如果不是重复数据删除,那就太好了)
  4. 如果存在其他类型的符号(C 函数、静态变量等),那很好。

  5. 我熟悉 class-dump,但 AFAIK,它将声明的类转储到您的二进制文件中,而不是转储到您的二进制文件中的调用方法。这不是我要找的。如果我错了,而您可以使用 class-dump 做到这一点,请纠正我。

  6. 我不完全确定这是否可行。因此,如果不是,那也是一个很好的答案。 :)

【问题讨论】:

    标签: objective-c ios macos cocoa


    【解决方案1】:

    我所知道的最接近的是otx,它是otool 的包装器,可以在 objc_msgSend() 调用站点重构选择器。

    http://otx.osxninja.com/

    【讨论】:

    【解决方案2】:

    如果您要求查找所有调用方法的完整列表,那么无论是静态还是动态,这都是不可能的。原因是方法可以通过多种方式调用,甚至可以通过动态和编程方式进行组装。

    除了使用 [Object message] 等 Objective-C 消息的常规方法调用之外,您还可以使用来自 objc/message.h 的 C-API 函数调度消息,例如objc_msgSend(str, del)。或者您可以使用NSInvocation API 或performSelector:withObject:(和类似方法)调度它们,请参阅examples here。在所有这些情况下使用的选择器可以是静态字符串,或者甚至可以使用诸如NSSelectorFromString 之类的字符串以编程方式构造它们。

    更糟糕的是,Objective-C 甚至支持dynamic message resolution,它允许对象响应根本不对应方法的消息!

    如果您只对特定的方法调用感到满意,那么解析上面列出的模式的源代码将为您提供在执行期间可能被调用的方法的最小列表。但是该列表可能既不完整(即不包含可能被调用的方法)也可能是过度完整的(即可能包含实际上未调用的方法)。

    【讨论】:

    • 我非常喜欢这个答案。您提出了一个至关重要的观点:由于您提到的 ObjC 运行时/语言功能,没有静态解决方案可以保证 100% 的覆盖率。不过,我会让我的问题保持不变,因为我认为可以找到其余部分的工具仍然有价值。
    • 我认为比所有元编程怪异更大的是在编译时不知道接收者类型的问题,这是确定调用什么方法所必需的。当我写[foo length]时,你不知道是-[NSString length]-[FootballField length]还是+[SomePoorlyDesignedClass length]——它可能是运行时三者的任意组合,甚至是从插件加载的其他方法。因此,您可以非常准确地确定发送了哪些消息,但要说出结果调用了哪些方法则更加不确定。
    • @Chuck 好点。不仅选择器,而且对象本身也可以动态构造。 +1 还指出了实例和类方法的微妙之处!
    【解决方案3】:

    另一个很棒的工具是class-dump,它一直是我进行静态分析的首选。

    【讨论】:

      【解决方案4】:
      otool -oV /path to executable/ | grep name | awk '{print $3}'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-05
        • 1970-01-01
        • 2020-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-18
        相关资源
        最近更新 更多