我需要捕獲並記錄Cocoa應用程序中的對象發送的所有消息。而且我還需要運行時的對象實例列表。這是可能的?捕獲所有Objective-C消息並獲得Cocoa運行時對象列表
回答
是的,它是可能的,objective-c是高度動態的,您可以在運行時獲得大量信息。仔細看看Objective-C Runtime Reference
你還沒有回答他的問題。哪種Objective-C運行時調用將允許記錄發送給每個對象的每條消息? – JeremyP 2010-10-06 14:24:32
是的,我認爲只有這樣才能捕獲所有的消息它是替代objc_msgSend方法與我的自定義方法。 – 2010-10-06 14:47:04
公平地說,它是一個與問題 – 2010-10-06 15:29:21
使用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運行。你會得到發送給任何對象的每條消息的日誌!真厲害!
通過將NSObjCMessageLoggingEnabled
環境變量設置爲YES,可以記錄應用程序中發送的每個Objective-C消息。在Xcode中選擇可執行文件,按Cmd-I顯示檢查器並在那裏添加環境變量(參數選項卡)。 Obj-C消息記錄在/tmp/msgSends-<pid>
。切記完成後關閉設置,因爲日誌文件可能是巨大的。
您也可以複製當前的方案並創建一個啓用msgSends的新方案。在'Run' - >'Arguments' - >'Environment variables'下。我建議讓計劃共享,以便您團隊中的其他人也可以使用它。一個「殭屍」計劃可以類似的有用。 – funroll 2013-08-13 13:36:31
- 1. 捕獲所有Windows消息
- 2. 捕獲對象上的所有方法/消息調用
- 3. 如何捕獲git commit消息並運行一個動作
- 4. 捕獲Win32消息
- 5. Cocoa - 獲取Adress Book的所有信息
- 6. 得到一個錯誤消息「未捕獲TypeError:對象.gearImg沒有方法'css'」
- 7. Rabbitmq並捕獲所有隊列
- 8. 所有JavaScript「未捕獲的SyntaxError:無效的正則表達式」消息列表
- 9. 遍歷所有字段並獲得它們的值protobuf消息
- 10. 如何獲得列中的所有對象Google電子表格
- 11. 將gmail消息導入電子表格並在下一個腳本運行時只會獲得新消息
- 12. HTTPClient - 捕獲所有重定向列表
- 13. 獲取並排序對象列表中的所有元素?
- 14. 如何獲得我所有時間的所有Facebook狀態信息的列表?
- 15. 如何讓所有喜歡對象的朋友獲得對象列表?
- 16. 選擇所有球員對象ObjectiveC
- 17. 捕獲錯誤消息
- 18. 捕獲警告消息
- 19. 捕獲FTP錯誤消息
- 20. 如何捕獲Windows消息?
- 21. 獲取SMS消息列表?
- 22. 獲取指向對象的所有其他對象的列表
- 23. 如何捕獲運行時對象上的事件
- 24. 在運行時獲取本地對象/變量列表
- 25. 列出所有驅動器/分區,並使用Cocoa獲得/ dev/rdisc設備
- 26. 你可以用msmq中的所有消息獲得一個列表嗎?
- 27. 捕獲/檢測程序中的所有運行時錯誤
- 28. Chrome擴展程序 - 如何捕獲所有運行時異常
- 29. 在運行時獲取所有初始化@命名豆列表
- 30. 在運行時獲取JSF中所有託管Bean的列表
在這裏,你必須問:爲什麼?你究竟想實現什麼? – 2010-10-06 15:29:45
我想繪製可可app的對象圖=) – 2010-10-08 12:44:57