【问题标题】:lldb breakpoint on all methods in class objective c类目标 c 中所有方法的 lldb 断点
【发布时间】:2015-06-23 14:44:38
【问题描述】:

如何使用 lldb 自动在 Objective C 类中的所有方法上设置断点?

这对于学习复杂的遗留类的行为很有用。我正在使用Xcode(包括lldb)进行iOS开发,手动浏览Xcode中的(大)文件并单击每个方法旁边的装订线设置断点很麻烦。

【问题讨论】:

    标签: ios objective-c xcode lldb


    【解决方案1】:

    一种选择是使用正则表达式断点。

    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:]。我会把它拿出来,因为它不应该是必要的。
    • 我写这个命令的地方。请在控制台或终端或代码中提出建议。
    • @ChandniSharma 进入 lldb,它通常以“(lldb)”作为提示。您必须运行 lldb,这是 Xcode 默认运行的。
    • 感谢您的回复,但仍然不知道我应该如何以及在哪里编写此命令。我在控制台上写吗?是的,我使用的是 Xcode 8.3.3,所以它使用了 lldb 调试器和 llvm 编译器。
    【解决方案2】:
    br se -f FooViewController.m -p '^@property|^ *- *\('
    

    "br se" 是 "breakpoint set" 的缩写,将您自己的文件名传递给 -f 参数,-p 参数是 Objective C 中属性和方法的粗略正则表达式。

    注意事项:这似乎不适用于.h 文件,因此如果您在标头中声明了要查看的属性,那么您可能需要在其支持实例上设置观察点变量。

    这是迄今为止我找到的最佳解决方案,如果您认为它们会有所帮助,请发布替代解决方案。

    【讨论】:

      猜你喜欢
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多