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
另外,我认为您会发现注销应用程序中调用的每个方法都会使您不知所措。您也许可以使用一些条件来对此进行过滤,但是我不知道这是否可以帮助您了解代码的执行方式。
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))
TA贡献1799条经验 获得超6个赞
可以使用debugger命令将Brad Larson的方法调整为在设备上运行:
printf "[%s %s]\n", (char *)object_getClassName($r0),$r1
可以在此处的技术说明中找到更多信息:technotes
- 3 回答
- 0 关注
- 443 浏览
添加回答
举报