可可:打破每一个方法调用?
通常在调试时,了解按什么顺序调用某个类的哪些方法对我来说很重要。 天真的解决方案(我迄今为止一直使用的)是在每个方法的顶部弹出一个NSLog
。 但是这是耗时的,重复的,丑陋的,并且如果我在调试后忘记删除日志,我的代码就会显得很少。
更清晰的解决方案是在我的每个方法上设置断点,配置它们的操作以发出调试器命令: po NSStringFromSelector(_cmd)
并将它们设置为自动继续。 这更漂亮,并且使我不必记住删除所有那些NSLog
,但不会更少重复或耗时。
我真正想要的是一种设置符号断点的方式,该断点在每个方法(类的一个模块?)上打破。 任何调试/运行时主机都有一个解决方案或技巧,从哪里开始寻找?
根据Objective-C运行时参考的“发送消息”部分,所有Objective-C方法调用都会经过一次C运行时调用objc_msgSend
, objc_msgSend_stret
, objc_msgSendSuper
和objc_msgSendSuper_stret
。 所以你应该能够捕获这些数据,并为它们提供动作来记录前两个参数的相关部分(它是普通发送的目标和选择器,描述超类的结构描述超类的目标和类类型)。
使用Log4Cocoa等日志系统。 记录调用它的方法,行号和文件是此类日志记录系统的基本功能。
每个日志记录调用都有一个详细级别,指定它应在什么条件下记录。 然后,您将设置详细程度以获取所需的信息量。 例如,为发布而构建的产品只会记录错误和警告; 调试级别会记录一切。
我认为你目前的做法是在每种感兴趣的方法上设置一个断点是最好的选择。 正如@Tommy解释的那样,在运行时有少量的消息分派函数可以打破,但我让调试器在每个消息发送时评估一个条件断点,这可能会显着减慢应用程序的速度。
一种让你的断点设置更简单的方法是从GDB命令文件中完成。 将命令设置为您可以在调试会话开始时加载的单个文件中所有感兴趣的方法的断点。 在单个文件中设置所有断点可为您提供一个位置来编辑列表,并且通过复制和粘贴来编辑文件应该很容易。
也许最好的解决方案,但需要一点时间掌握的解决方案是使用仪器。 您需要首先阅读DTrace机制,但您可以使用各种感兴趣的方法轻松创建自定义工具。 仪器非常强大,但需要一些时间来学习真正使用它。
链接地址: http://www.djcxy.com/p/47381.html