2013-02-16 59 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指令的問題。如果您更改您的調試版本設置以優化到最快,最小和崩潰,那麼這就是您的問題。