在使用expression -o -- (NSString *)[[UIWindow keyWindow] recursiveDescription]
调试视图层次结构时,我收到了-[UILabel length]: unrecognized selector sent to instance 0xd4ebe50
。如果调试器获得unrecognized selector
,我想使用LLDB来调试问题并获得堆栈跟踪。
我试过
breakpoint set --selector length
和breakpoint set --selector -[UILabel length]
手动设置断点会导致警告WARNING: Unable to resolve breakpoint to any actual locations.
在调试过程中不会触发断点。
是否可以在unrecognized selector
停止并获得堆栈跟踪?
答案 0 :(得分:2)
在xCode中,您可以将断点设置为所有Objective-C无法处理的异常。为此,在Breakpoint Navigator中,按导航器左下角的 + 符号,然后选择“Add Exception Breakpoint”:
您将看到“所有例外”条目。右键单击它,选择Edit Breakpoint并按如下所示进行配置:
然后,当您的应用程序崩溃时,执行将在冲突代码中中断,显示堆栈跟踪和您需要的所有信息。
希望它有所帮助!
答案 1 :(得分:1)
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:]
处断开。