2011-08-05 20 views
4

通常在调试时,了解按什么顺序调用某个类的哪些方法非常重要。天真的解决方案(我迄今为止使用的)是在每个方法的顶部弹出一个NSLog。但是这是耗时的,重复的,丑陋的,并且如果我在调试后忘记删除日志,我的代码就会显得很少。可可:在每一个方法调用中休息一下?

更干净的解决方案是在我的每个方法上设置断点,配置它们的操作以发出调试器命令:po NSStringFromSelector(_cmd)并将它们设置为自动继续。这更漂亮,并且使我不必记住去除所有那些,但是不会更少重复或耗时。

我真正想要的是设置一个断点符号上的每一个方法打破的方式(一类的?模块的?)。任何调试/运行时主机都有一个解决方案或技巧,从哪里开始寻找?

+0

你看过dtrace吗? –

回答

6

所有Objective-C的方法调用经历的C运行时调用objc_msgSendobjc_msgSend_stretobjc_msgSendSuperobjc_msgSendSuper_stret%的“发送消息”的Objective-C Runtime Reference的部分之一。所以你应该能够捕获这些数据,并为它们提供动作来记录前两个参数的相关部分(它是普通发送的目标和选择器,描述超类的结构描述超类的目标和类类型)。

+2

很好的答案,但是我希望在每个'objc_msgSend'上处理一个断点来减慢速度。 – Caleb

+0

它绝对会,尤其是当你把getter和setter放进去的时候。如果不是调试器能够实现的功能的专家,那么我认为做一件聪明的事情,特别是参考问题集时,只有在目标是特定类或类组的实例时才会记录。你可以用简单的代码解释吗? – Tommy

+0

? – Shamsiddin

2

使用类似Log4Cocoa的测井系统。记录调用它的方法,行号和文件是此类日志记录系统的基本功能。

每个日志记录调用都有一个详细级别,指定它应在什么条件下记录。然后,您将设置详细程度以获取所需的信息量。例如,为发布而构建的产品只会记录错误和警告;调试级别会记录一切。

2

我认为你目前的做法是在每种感兴趣的方法上设置一个断点是最好的选择。正如@Tommy解释的那样,在运行时有少量的消息分派函数可以打破,但我让调试器在每个消息发送时评估一个条件断点,这可能会显着减慢应用程序的速度。

让您的断点更容易设置的一种方法是从GDB命令文件中进行设置。将命令设置为您可以在调试会话开始时加载的单个文件中所有感兴趣的方法的断点。在单个文件中设置所有断点可为您提供一个位置来编辑列表,并且通过复制和粘贴来编辑文件应该很容易。

也许是最好的解决办法,但需要一点时间来掌握一个,就是用仪器。您需要首先阅读DTrace机制,但您可以使用各种感兴趣的方法轻松创建自定义工具。仪器非常强大,但需要一些时间来学习真正使用它。

相关问题