如何记录iOS应用中使用的所有方法

我正在为客户接管iPad应用程序的开发。目前已经完成了大量工作,我试图将整个过程设计为如何运行。

我想做的一件事是记录应用程序运行时调用哪些方法。我已经看到了自定义的DTrace脚本,该脚本旨在记录启动时的所有方法,但是当我在Instruments中运行该脚本时,没有任何结果。

记录方法的最佳方法是什么?


呼啦一阵风
浏览 444回答 3
3回答

明月笑刀无情

通过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另外,我认为您会发现注销应用程序中调用的每个方法都会使您不知所措。您也许可以使用一些条件来对此进行过滤,但是我不知道这是否可以帮助您了解代码的执行方式。

开心每一天1111

如果使用的是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))

哈士奇WWW

可以使用debugger命令将Brad Larson的方法调整为在设备上运行:printf "[%s %s]\n", (char *)object_getClassName($r0),$r1可以在此处的技术说明中找到更多信息:technotes
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS