【发布时间】:2015-06-23 14:44:38
【问题描述】:
如何使用 lldb 自动在 Objective C 类中的所有方法上设置断点?
这对于学习复杂的遗留类的行为很有用。我正在使用Xcode(包括lldb)进行iOS开发,手动浏览Xcode中的(大)文件并单击每个方法旁边的装订线设置断点很麻烦。
【问题讨论】:
标签: ios objective-c xcode lldb
如何使用 lldb 自动在 Objective C 类中的所有方法上设置断点?
这对于学习复杂的遗留类的行为很有用。我正在使用Xcode(包括lldb)进行iOS开发,手动浏览Xcode中的(大)文件并单击每个方法旁边的装订线设置断点很麻烦。
【问题讨论】:
标签: ios objective-c xcode lldb
一种选择是使用正则表达式断点。
breakpoint set -r '\[ClassName .*\]$'
您可以使用正则表达式来满足您的需求。
该命令将创建一个断点,该断点在该类实现的所有方法上停止。但是,从超类继承的方法不会有断点。
要获取超类的方法,您必须使用条件断点。例如,如果超类是UIViewController,你可以这样做:
br s -r '\[UIViewController .*\]$' -c '(BOOL)[(id)$arg1 isKindOfClass:[CustomVC class]]'
对于 x86,将 (id)$arg1 更改为 *(id*)($ebp+8)。
最后,如果你真的想通过各种类了解控制流,请查看 dtrace。它可能比调试器更适合这个。
【讨论】:
\[ClassName(\(.*\)) .*\]$ 是什么意思,但是\[FooViewController .*\]$ 对我有用。我也喜欢省略 $ 导致块上的断点。打破超类方法的正则表达式也很好。感谢您的提示,我一定会查看 dtrace。
(\(.*\)) 后面应该有?。那部分是匹配类别,例如-[UIView(Geometry) setFrame:]。我会把它拿出来,因为它不应该是必要的。
br se -f FooViewController.m -p '^@property|^ *- *\('
"br se" 是 "breakpoint set" 的缩写,将您自己的文件名传递给 -f 参数,-p 参数是 Objective C 中属性和方法的粗略正则表达式。
注意事项:这似乎不适用于.h 文件,因此如果您在标头中声明了要查看的属性,那么您可能需要在其支持实例上设置观察点变量。
这是迄今为止我找到的最佳解决方案,如果您认为它们会有所帮助,请发布替代解决方案。
【讨论】: