在调试会话期间中断`无法识别的选择器发送到实例`

时间:2013-07-01 14:55:52

标签: xcode lldb

在使用expression -o -- (NSString *)[[UIWindow keyWindow] recursiveDescription]调试视图层次结构时,我收到了-[UILabel length]: unrecognized selector sent to instance 0xd4ebe50。如果调试器获得unrecognized selector,我想使用LLDB来调试问题并获得堆栈跟踪。

我试过

  • 在Xcode中设置异常断点
  • 设置断点w / breakpoint set --selector length
  • 设置断点w / breakpoint set --selector -[UILabel length]

手动设置断点会导致警告WARNING: Unable to resolve breakpoint to any actual locations.在调试过程中不会触发断点。

是否可以在unrecognized selector停止并获得堆栈跟踪?

4 个答案:

答案 0 :(得分:2)

在xCode中,您可以将断点设置为所有Objective-C无法处理的异常。为此,在Breakpoint Navigator中,按导航器左下角的 + 符号,然后选择“Add Exception Breakpoint”:

enter image description here

您将看到“所有例外”条目。右键单击它,选择Edit Breakpoint并按如下所示进行配置:

enter image description here

然后,当您的应用程序崩溃时,执行将在冲突代码中中断,显示堆栈跟踪和您需要的所有信息。

希望它有所帮助!

答案 1 :(得分:1)

如果没有相关库的dSYM(在本例中为UIKit),

breakpoint set --selector在Xcode 4.6中无法正常工作。

我希望breakpoint set -n "-[UILabel length]"可以工作。或者您可以在Xcode中添加符号断点。调试>断点>创建符号断点,您应该能够输入-[UILabel length]

请记住,最短的唯一命令在lldb中始终有效,因此br s -S length是写breakpoint set --selector length的另一种方式。

类似的问题在unrecognized selector sent to instance中结束,其中一项建议是po 0xd4ebe50

答案 2 :(得分:1)

  

是否可以在无法识别的选择器上停止并获得堆栈跟踪?

要阻止lldb将应用状态调用expression--unwind-on-error false(简称:-u false)重绕。如果使用此选项,lldb将不会清理状态。

然而,这并没有帮助我调试标签所在的视图层次结构中的位置。 lldb从一开始就告诉我,标签可以在地址0xd4ebe50找到。 po [0xd4ebe50 text]的输出给了我一个调查的线索。我在标签上添加了绿色背景以获得进一步的帮助。罪魁祸首是一个名为description的标签,导致了-recursiveDescription的问题。

答案 3 :(得分:1)

@ lucaslt89的答案中Xcode Objective-C异常断点的下面是一个lldb断点,它很简单:

breakpoint set --name objc_exception_throw

对于无法识别的选择器错误,您也可以在-[NSObject(NSObject) doesNotRecognizeSelector:]处断开。