2012-03-27 14 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}' 
相關問題