2010-10-06 51 views

回答

0

是的,它是可能的,objective-c是高度動態的,您可以在運行時獲得大量信息。仔細看看Objective-C Runtime Reference

+0

你還沒有回答他的問題。哪種Objective-C運行時調用將允許記錄發送給每個對象的每條消息? – JeremyP 2010-10-06 14:24:32

+0

是的,我認爲只有這樣才能捕獲所有的消息它是替代objc_msgSend方法與我的自定義方法。 – 2010-10-06 14:47:04

+1

公平地說,它是一個與問題 – 2010-10-06 15:29:21

8

使用dtrace,它已經內置到系統中。在MacTech上查看this great introductory article

Dtrace是一個全系統的標準機制,因此您可以記錄活動。各種系統API通知內核,即每個系統調用,每個objc_msgSend等都會生成一個可追蹤點,並且您可以將dtrace腳本傳遞給內核以記錄這些活動。它非常強大。

作爲練習,請把下列一個名爲objc.d文件:

objc$target:::entry 
{ 
    printf("[%s %s]\n", probemod,probefunc); 
} 

然後在命令行

$ sudo dtrace -q -s objc.d -p 3333 

其中3333應該是一些Cocoa程序的PID運行。你會得到發送給任何對象的每條消息的日誌!真厲害!

+0

相匹配的答案您應該將輸出重定向到一個文件以供日後分析。這顯然會迅速產生真正龐大的數據量。像'sudo dtrace -q -s objc.d -p 3333>/tmp/allmethodcalls.txt' – bbum 2010-10-06 19:43:37

+1

請注意,上面不一定會捕獲每一個方法調用。輸出速度對dtrace來說太快了,在主動計算過程中會有數千個數據丟失。 – bbum 2010-10-06 19:45:14

+0

你完全正確。 – Yuji 2010-10-06 20:03:42

2

通過將NSObjCMessageLoggingEnabled環境變量設置爲YES,可以記錄應用程序中發送的每個Objective-C消息。在Xcode中選擇可執行文件,按Cmd-I顯示檢查器並在那裏添加環境變量(參數選項卡)。 Obj-C消息記錄在/tmp/msgSends-<pid>。切記完成後關閉設置,因爲日誌文件可能是巨大的

+1

您也可以複製當前的方案並創建一個啓用msgSends的新方案。在'Run' - >'Arguments' - >'Environment variables'下。我建議讓計劃共享,以便您團隊中的其他人也可以使用它。一個「殭屍」計劃可以類似的有用。 – funroll 2013-08-13 13:36:31

相關問題