运行代码返回垃圾;输入调试器会返回正确的结果

时间:2011-03-05 04:41:39

标签: objective-c cocoa debugging gdb

以下是我设置断点的代码(我将完全的强制转换与我在GDB中输入的内容相匹配,但没有它们的结果相同):

NSUInteger addedRefOrder = (NSUInteger)[(NSArray*)[sourceMap tileRefsAtX:[addedRef x] y:[addedRef y]] indexOfObject:addedRef];

这是我在GDB中输入的内容:

(gdb) print (NSUInteger)[(NSArray*)[sourceMap tileRefsAtX:[addedRef x] y:[addedRef y]] indexOfObject:addedRef]
$2 = 1
(gdb) print addedRefOrder
$3 = 9223372036854775807

为了记录,我很确定后一个值是NSNotFound。这个问题到底意味着什么呢?我怎么开始调试这个?

编辑:我很肯定对象在数组中。 NSNotFound已退回,但不正确。这是同一个应用程序中其他地方的另一种情况:

NSPoint irisPoint = NSMakePoint([currentObject x], [currentObject y]);

该行之后的断点:

(gdb) print irisPoint
$1 = {
  x = 4301764096, 
  y = 4301764096
}
(gdb) print [currentObject x]
$2 = 4
(gdb) print NSMakePoint([currentObject x], [currentObject y])
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000018
0x00007fff885e010a in objc_msgSend ()

2 个答案:

答案 0 :(得分:2)

在使用addedRefOrder之前,您似乎没有进行以下检查。

if (addedRefOrder == NSNotFound) {
   NSLog(@"Object %@ not found in array %@", addedRef, array);
}

如果它是NSNotFound,那么它不是垃圾值,我不会质疑这个结果并在查找代码中的其他地方之前打破调试器。是什么让你认为这不对?通常这些都是我们自己的错。您可能忽略了此代码段范围之外的逻辑问题。

如果上述情况属实,请检查您的代码,找出它不在数组中的原因。

要检查的一件事是你的isEqual实现:对于addedRef对象的类。因为这就是数组如何确定对象是否在数组中。

另外,我不相信调试器中第一行的结果。您刚刚第二次调用了所有这些方法,并且可能会在那些会影响返回值的调用中发生任何事情。也许你第二次调用它时,由于某些副作用,它实际上是在数组中。

它也可能是一些并发问题,如果你不使用线程,你应该可以轻松排除。如果你那时我会看那里常见的嫌犯。

答案 1 :(得分:0)

事实证明问题是xy属于NSInteger类型,并且编译器无法将其与其他CGFloat {{1}保持一致}和x方法。

最终的解决方案是明确地将y转换为正确的类型。