通常在调试时,重要的是要知道以什么顺序调用类的哪些方法。天真的解决方案(我到目前为止一直在使用)是在每个方法的顶部弹出一个NSLog
。但这是耗时,重复,丑陋的,如果我在调试后忘记删除日志,那么我的代码看起来很少。
更简洁的解决方案是在我的每个方法上设置断点,配置其操作以发出调试器命令:po NSStringFromSelector(_cmd)
并将它们设置为自动继续。这更漂亮,使我不必记住删除所有NSLog
,但不会重复或耗费时间。
我真正想要的是一种设置符号断点的方法,该断点在每个方法(类的?模块?)上都会中断。任何调试/运行时主人都有一个解决方案或提示从哪里开始寻找?
答案 0 :(得分:6)
所有Objective-C方法调用都按照{发送消息'部分中的一个C运行时调用objc_msgSend
,objc_msgSend_stret
,objc_msgSendSuper
和objc_msgSendSuper_stret
进行调用{3}}。所以你应该能够捕获那些,并给它们动作来记录前两个参数的相关部分(它是正常发送的目标和选择器,一个描述超类的结构,包含超级调用的目标和类类型) )。
答案 1 :(得分:2)
使用Log4Cocoa之类的日志记录系统。记录调用它的方法,行号和文件是此类日志记录系统的基本功能。
每个日志记录调用都有一个详细级别,指定它应记录的条件。然后,您将设置详细级别以获取所需的信息量。例如,为发布而构建的产品只会记录错误和警告;调试级别会记录所有内容。
答案 2 :(得分:2)
我认为您目前在每种感兴趣的方法上设置断点的方法是最好的选择。正如@Tommy所解释的那样,运行时中有少量的消息调度函数可供使用,但我让调试器在每次发送消息时评估条件断点可能会大大降低应用程序的速度。
使设置断点更容易的一种方法是从GDB命令文件中执行此操作。将命令设置为可以在调试会话开始时加载的单个文件中的所有感兴趣方法的断点。在一个文件中设置所有断点为您提供了一个编辑列表的位置,编辑文件应该很容易复制和粘贴。
也许最好的解决方案,但需要一点时间掌握的是使用仪器。您将首先阅读DTrace机制,但您可以轻松地创建一个自定义仪器,其中包含每个感兴趣方法的探针。仪器非常强大,但学会真正使用它需要一些时间。