Ios 在条件断点中访问类

Ios 在条件断点中访问类,ios,objective-c,xcode,debugging,xcode5,Ios,Objective C,Xcode,Debugging,Xcode5,我有一个要调试的方法: -(void)doAThingWithObject:(BaseDataObject *)dataObject //called VERY often 我在这个方法中有一个Xcode断点,我只想在BaseDataObject的某个子类上断开它,所以我添加了一个断点w/conditional来检查该类: [dataObject是KindofClass:[SubassofBaseDataObject类]] 但是,这样做会导致分析错误 Stopped due to an err

我有一个要调试的方法:

-(void)doAThingWithObject:(BaseDataObject *)dataObject //called VERY often
我在这个方法中有一个Xcode断点,我只想在BaseDataObject的某个子类上断开它,所以我添加了一个断点w/conditional来检查该类:

[dataObject是KindofClass:[SubassofBaseDataObject类]]

但是,这样做会导致分析错误

Stopped due to an error evaluating condition of breakpoint 11.1: "[dataObject isKindOfClass:[SubClassOfBaseDataObject class]]"
Couldn't parse conditional expression:
error: no known method '+class'; cast the message send to the method's return type
error: 1 errors parsing expression
我已确保导入文件中的所有类,但调试器不知道我在条件中引用的是哪个类

但是,在断点之前的方法中创建所述类的临时变量:

Class subClassCheck = [SubClassOfBaseDataObject class];
以及更新断点条件以引用temp变量:

[dataObject isKindOfClass:subClassCheck]
不会抛出错误


对于断点条件,我是个新手,有人能解释一下为什么我的第一种方法不起作用吗?

基于Cocoa这样的大框架的调试代码的一个复杂问题是,编译器发出或调试器使用您包含的整个框架闭包中的每种类型和函数是不实际的。因此,编译器使用一些启发式方法来减少生成的调试信息量。它将仅为您实际使用的类型发出类型信息,以及定义方法的函数/ObjC方法信息(与在头文件中声明的方法相反)。还有一点微妙之处,lldb将从ObjC运行时中读取方法的类型信息,尽管此信息不完整,因为它是为运行时而不是为调试器准备的。。。因此,我们有时似乎知道一些ObjC方法违反了前面的规则

另一个需要注意的重要事项是,对于返回大于指针的函数(如NSMakeRect等)的调用约定是这样的:如果调试器调用一个函数,认为它返回指针,而实际上返回的是更大的结构,那么该行为将导致程序中的堆栈损坏。如果幸运的话,在继续操作时会立即崩溃,但如果不幸的话,它只会更改一些数据值,并导致您花费数小时试图追踪调试器实际导致的一些有趣行为。因此,调试器将拒绝调用其无法确定返回类型的函数

无论如何,您得到的错误是因为调试器无法在对象上找到“+类”方法的调试信息。这并不奇怪,因为“类”是NSObject上的一个方法,而不是您的类。我不确定为什么我们在运行时找不到它,可能是因为它是一个类方法?这值得一试。显然,我们确实从运行时获得了isKindOfClass的类型:否则您的解决方案也会失败

在本例中,由于您实际上知道类方法的返回类型,因此可以通过在断点表达式中显式强制转换来解决调试器缺乏知识的问题。在调试器的表达式解析器中强制转换函数返回有两个目的,一个是常规的C语言函数,另一个是告诉调试器函数的返回类型,否则它将无法确定该函数的返回类型。一种仅用于返回类型的速记原型

比如:

[dataObject isKindOfClass: (Class) [SubClassOfBaseDataObject class]]
应该可以在不修改代码的情况下工作


另外请注意,断点条件使用与“expr”或“print”命令相同的机制运行。因此,试验断点命令最简单的方法是设置一个无条件断点,点击它,然后转到lldb控制台,玩“打印”直到你得到一些有用的东西。

这是我收到的关于StackOverflow的最令人满意的答案。它描述了我的发现,解释了我发现它的环境,甚至还预先警告了我在处理调试器时可能遇到的其他问题。我也很高兴我的期望是(某种程度上)正确的,这是一个值得发现的bug报告。同时找到一个解决办法,我可以顺便去看看?人们还能要求什么呢?