2013-02-16 24 views
4

我很难试图调试iOS上的问题,这似乎只与发布版本发生,似乎暗示优化器正在做一些播放不好的东西用我的代码。崩溃的代码是一些将一些二进制数据序列化为NSMutableData实例的代码,如下所示。Objective C Seg Fault只有在启用编译器优化时才会发生

[_data increaseLengthBy:sizeof(CFSwappedFloat64)]; 
*((CFSwappedFloat64 *)[self pointerAtOffset]) = CFConvertFloat64HostToSwapped(value); 
_offset += sizeof(CFSwappedFloat64); 

_data是一个NSMutableData实例。 pointerAtOffset和这个类的init方法定义如下。

- (unsigned char *)pointerAtOffset { 
    return ((unsigned char *)_data.mutableBytes) + _offset; 
} 

- (id)init { 
    if(self = [super init]) { 
     _data = [[NSMutableData alloc] initWithCapacity:1028]; 
     _offset = 0; 
    } 
    return self; 
} 

现在奇怪的是,如果我添加一个NSLog打印语句,它修复了错误。

[_data increaseLengthBy:sizeof(CFSwappedFloat64)]; 
NSLog(@"%d - %d", (int)_data.mutableBytes, _offset); 
*((CFSwappedFloat64 *)[self pointerAtOffset]) = CFConvertFloat64HostToSwapped(value); 
_offset += sizeof(CFSwappedFloat64); 

任何想法可能会导致这种情况?部署由于NSLog语句而工作的代码有点令人不安。

+0

不知道是否值得注意的是,如果我复制pointerAtOffset内联的实现,它也似乎不会崩溃。 – ddt 2013-02-16 07:36:13

+0

我看起来像优化器无法看到'increaseLengthBy:'和'pointerAtOffset'都引用'_offset',所以它将移动呼叫。有没有办法('#pragma'?)在本地降低优化级别或强制正确的调用序列?否则,你可以为整个文件做,直到找到更好的解决方案。 NSLog调用强制执行此命令,这就是为什么当它被保留时它会工作。 – Monolo 2013-02-16 12:16:09

+0

您是否使用ARC?在使用指针之前可能会自动释放_data。 – monoxygen 2013-02-17 22:50:45

回答

0

这让我想起了armv6 Thumb指令的问题。如果您更改您的调试版本设置以优化到最快,最小和崩溃,那么这就是您的问题。