如何在 objc 类的 init 中设置 lldb 断点
Posted
技术标签:
【中文标题】如何在 objc 类的 init 中设置 lldb 断点【英文标题】:How do I set an lldb breakpoint in init of objc class 【发布时间】:2019-11-04 11:38:27 【问题描述】:我正在调查在哪里制作/展示了一个有问题的错误配置的警报控制器
由于未捕获的异常“NSGenericException”而终止应用程序, 原因:'您的应用程序提供了一个 UIAlertController () 风格 来自 UP.BVTabBarViewController 的 UIAlertControllerStyleActionSheet ()。 modalPresentationStyle 具有这种风格的 UIAlertController 是 UIModalPresentationPopover。 您必须通过 警报控制器的 popoverPresentationController。您必须提供 sourceView 和 sourceRect 或 barButtonItem。如果这 当您出示警报控制器时,信息未知,您 可以在 UIPopoverPresentationControllerDelegate 方法中提供它 -prepareForPopoverPresentation。
天真地我试过这个:
(lldb) br s -n "-[UIAlertController init]"
Breakpoint 100: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
什么是正确的(工作)方式?
【问题讨论】:
为什么需要断点?很明显错误是什么;你为什么不把它修好?在您的代码中搜索actionSheet
。 iPad 上的操作表必须始终配置为带有箭头源的弹出框。
我有大约十几个呼叫站点,宁愿避开添加 12 个断点来识别配置错误的警报控制器实例的“乐趣”
但它会在视觉上立即显而易见。它将是不配置弹出框的那个!一打并不多。将它们全部查看比一遍又一遍地运行应用程序试图让有缺陷的应用程序出现要快得多。
【参考方案1】:
为了提供更通用的答案,对于您可以做的任何课程:
br s -r '-\[UISomeClass init'
br s -r '\+\[UISomeClass '
第一个在任何以init
开头的方法上创建一个断点。第二个匹配所有类方法,并为每个方法创建断点。
两种方法都没有涵盖的一种情况:超类方法。 UIAlertController
可能不关心,但一般断点只能在类实现的方法上设置,而不是在继承的方法上。
【讨论】:
让我想知道当你必须处理诸如 nsarray 或 nsstring 之类的外观类时是否有任何recorse ... 您也可以在选择器 (break set -S
) 上设置断点,但对于像 init
这样的东西,可能会有太多的命中而无用。如果它在您自己的代码中,将断点限制在您的可执行文件中可能会使这更容易接受...
将--in-class-hierarchy-of
和--derives-from
修饰符用于选择器断点将限制断点到给定类的类层次结构中的类或从给定类派生的类。看起来 NSArray/NSString 实现类确实是从 NSArray/NSString 派生的......注意,如果你有足够的动力,你实际上可以使用脚本断点解析器在 Python 中做这样的事情。【参考方案2】:
除非您完全错误地这样做,否则您的警报控制器都是通过调用创建的
+[UIAlertController alertControllerWithTitle:message:preferredStyle:]
但是,这个断点实际上是没有必要的,它对你没有帮助,因为除非你调用导致问题的特定警报,否则你不会遇到断点。相反,只需在您的代码中全局搜索 .actionSheet
并修复未配置为弹出框的代码。
规则是,在 iPad 上,必须明确地为所有操作表指定一个源视图或源栏按钮项,以便箭头指向;当您遇到您没有这样做的操作表时,它会立即显而易见。
【讨论】:
好的,十几个中只有四个是操作表。非常感谢。以上是关于如何在 objc 类的 init 中设置 lldb 断点的主要内容,如果未能解决你的问题,请参考以下文章