2

在调试视图层次结构时,expression -o -- (NSString *)[[UIWindow keyWindow] recursiveDescription]我收到了一个-[UILabel length]: unrecognized selector sent to instance 0xd4ebe50. 我想使用 LLDB 来调试问题并在调试器获取unrecognized selector.

我试过了

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

手动设置断点会导致警告WARNING: Unable to resolve breakpoint to any actual locations.调试期间未触发断点。

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

4

4 回答 4

2

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

在此处输入图像描述

您将看到一个“所有例外”条目。右键单击它,选择编辑断点并配置如下:

在此处输入图像描述

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

希望能帮助到你!

于 2013-07-02T00:52:53.403 回答
1

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

expression使用--unwind-on-error false(short: )阻止 lldb 倒回应用程序状态调用-u false。如果使用此选项,lldb 将不会清理状态。

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

于 2013-10-17T19:15:15.670 回答
1

breakpoint set --selector如果没有相关库的 dSYM(在本例中为 UIKit),则在 Xcode 4.6 中无法正常工作。

我希望breakpoint set -n "-[UILabel length]"能工作。或者您可以在 Xcode 中添加符号断点。Debug > Breakpoints > Create Symbolic Breakpoint 应该可以进入-[UILabel length].

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

一个类似的问题在发送到一个推荐的实例的无法识别的选择器中结束po 0xd4ebe50

于 2013-07-01T23:24:59.963 回答
1

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

breakpoint set --name objc_exception_throw

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

于 2020-07-12T19:51:11.273 回答