为了账号安全,请及时绑定邮箱和手机立即绑定

如何记录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 关注
  • 443 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信