亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何記錄iOS應用中使用的所有方法

如何記錄iOS應用中使用的所有方法

iOS
呼啦一陣風 2019-11-25 11:14:56
我正在為客戶接管iPad應用程序的開發。目前已經完成了大量工作,我試圖將整個過程設計為如何運行。我想做的一件事是記錄應用程序運行時調用哪些方法。我已經看到了自定義的DTrace腳本,該腳本旨在記錄啟動時的所有方法,但是當我在Instruments中運行該腳本時,沒有任何結果。記錄方法的最佳方法是什么?
查看完整描述

3 回答

?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

通過TC的回答類似的問題的啟發在這里,我把一個調試斷點動作,將注銷類和方法名,每objc_msgSend()時觸發您的應用程序。這與我在此答案中描述的DTrace腳本類似。


要啟用此斷點操作,請創建一個新的符號斷點(在Xcode 4中,轉到斷點導航器并使用窗口左下方的加號創建一個新的符號斷點)。將符號objc_msgSend設置為,將其設置為在評估操作后自動繼續,然后使用以下命令將該操作設置為調試器命令:


printf "[%s %s]\n", (char *)object_getClassName(*(long*)($esp+4)),*(long *)($esp+8)

您的斷點應如下所示:


斷點動作


在針對您的應用程序運行時,這應該注銷以下消息:


[UIApplication sharedApplication]

[UIApplication _isClassic]

[NSCFString getCString:maxLength:encoding:]

[UIApplication class]

[SLSMoleculeAppDelegate isSubclassOfClass:]

[SLSMoleculeAppDelegate initialize]

如果您想知道我在哪里提取了內存地址,請閱讀有關Objective-C運行時內部的Phrack文章。上面的內存地址僅適用于Simulator,因此您可能需要進行調整才能針對iOS設備上的應用程序運行。Collin建議在回答中進行以下修改以在設備上運行該修改:


printf "[%s %s]\n", (char *)object_getClassName($r0),$r1

另外,我認為您會發現注銷應用程序中調用的每個方法都會使您不知所措。您也許可以使用一些條件來對此進行過濾,但是我不知道這是否可以幫助您了解代碼的執行方式。


查看完整回答
反對 回復 2019-11-25
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

如果使用的是LLDB,則需要使用以下調試器命令。這些已在Xcode 4.6中進行了測試。


設備:


expr -- (void) printf("[%s %s]\n", (char *)object_getClassName($r0),$r1)

模擬器:


expr -- (void) printf("[%s %s]\n", (char *)object_getClassName(*(long*)($esp+4)), *(long *)($esp+8))


查看完整回答
反對 回復 2019-11-25
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

可以使用debugger命令將Brad Larson的方法調整為在設備上運行:


printf "[%s %s]\n", (char *)object_getClassName($r0),$r1

可以在此處的技術說明中找到更多信息:technotes


查看完整回答
反對 回復 2019-11-25
  • 3 回答
  • 0 關注
  • 471 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號