2012-03-27 15 views
6

假设我有一个基于可可的Mac或iOS应用程序。我想在我的应用程序的源代码,运行一个静态分析应用程序的二进制检索称为其中所有的Objective-C的方法列表。有没有可以做到这一点的工具?如何静态转储在Cocoa App中调用的所有ObjC方法?

的几点:

  1. 我找了一个静态的解决方案。我不是在寻找dynamic solution

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

  3. 理想情况下,输出将只是的Objective-C的方法,如一个巨大的去欺骗名单:

     
    … 
    -[MyClass foo] 
    … 
    +[NSMutableString stringWithCapacity:] 
    … 
    -[NSString length] 
    … 
    
    (如果它不是去欺骗这很酷)

  4. 如果其他类型的符号(C函数,静态变量等)都存在,这很好。

  5. 我熟悉class-dump,但据我所知,它转储声明的类在你的二进制文件,而不是调用的方法在你的二进制文件。这不是我要找的。如果我错了,你可以做这个类转储,请纠正我。

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

回答

9

我所知道的最接近的是otx,这是围绕otool的包装,可以在objc_msgSend()调用的地方重建选择。

http://otx.osxninja.com/

+0

优秀的指针,感谢bbum! – 2012-03-27 17:02:42

+1

域名不存在了。 http://web.archive.org/web/20130929164302/http://otx.osxninja.com/来自archive dot org。 – Klaas 2017-02-18 14:01:37

0

另一个伟大的工具是class-dump这一直是我的静态分析的第一选择。

+0

对不起,我没有正确地阅读你的问题... – Chris 2012-03-27 17:21:04

7

如果您要求查找所有调用方法的完整列表,则这是不可能的,无论是静态还是动态。原因是可以用各种方法调用方法,甚至可以动态地和以编程方式组装。

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

让事情变得更糟Objective-C甚至支持dynamic message resolution,它允许对象响应与根本不对应的消息!

如果您只对特定的方法调用感到满意,那么解析上面列出的模式的源代码会给您一个可能在执行过程中调用的最小方法列表。但是该列表可能既不完整(即,不包含可能被调用的方法)也不完整(即,可能包含在实践中未被调用的方法)。

+0

我非常喜欢这个答案。您提出了一个非常重要的观点:由于您提到的ObjC运行时/语言功能,没有静态解决方案可以保证100%的覆盖率。然而,我会让我的问题站在我的立场,因为我认为仍然有可能找到其余的工具的价值。 – 2012-03-27 17:40:58

+3

我觉得比所有的元编程怪异都要大,这是在编译时不知道接收者类型的问题,这是确定调用什么方法所必需的。当我写'[foo length]'时,你不知道这是' - [NSString length]',' - [FootballField length]还是'+ [SomePoorlyDesignedClass length]' - 它可能是三者的任意组合运行时,甚至是从插件加载的其他一些方法。因此,您可以用相当高的保真度来确定发送了哪些*消息,但是如果试图说明作为结果调用了哪些*方法,则更加如此。 – Chuck 2012-03-27 18:31:49

+0

@Chuck好点。它不仅是选择器,而且是可以动态构建的对象本身。 +1也用于指出实例和类方法的细微之处! – user8472 2012-03-27 18:41:39

0
otool -oV /path to executable/ | grep name | awk '{print $3}' 
相关问题