2014-04-22 23 views
7

Trong ứng dụng của tôi, tôi có mã Objective-C sau:Lỗi tối ưu hóa vòng lặp LLVM?

-(void)layoutPages 
{ 
    NSMutableArray* sections = [NSMutableArray array]; 
    [sections addObject:[[NSAttributedString alloc] initWithString:@"Hello world"]]; 

    for (NSAttributedString* contentSection in sections) { 
     NSLog(@"%@",contentSection); 
    } 
} 

enter image description here

điều khiển đầu ra: 2014-04-22 14:11:01.505 MyApp[24784:830b] Hello world{}

Nếu tôi biên dịch cho kiến ​​trúc x86_64 sử dụng -os tối ưu hóa, LLVM sau đó âm thầm tối ưu hóa ra biến vòng lặp 'contentSection'. Khi tôi sử dụng -O0, lỗi sẽ biến mất. Đây là đầu ra khi tôi cố gắng để in các mô tả của biến contentSection:

(lldb) po contentSection 
error: Couldn't materialize struct: the variable 'contentSection' has no location, it may have been optimized out 
Errored out in Execute, couldn't PrepareToExecuteJITExpression 

thế nào là tốt? Theo quan điểm của tôi, một biến vòng lặp không bao giờ được tối ưu hóa khi được sử dụng bên trong vòng lặp. Tôi đã thấy rằng những người khác có một vấn đề tương tự với LLVM nhưng không phải với một biến vòng lặp. Đây có phải là lỗi trình biên dịch không?

+0

bạn đã thử sử dụng thuộc tính self.contentSections thay vì một ivar –

+0

Cảm ơn @PeterLapisu Tôi đã thử điều này với cùng một kết quả. – Sbhklr

+0

Bạn đã khai báo 'iVar' hoặc' @ property' như thế nào? Như những gì có thể xảy ra là việc quản lý bộ nhớ vigiours hơn có thể đang diễn ra với '-Os' và' _contentSections' đang được deallocated. – Rich

Trả lời

3

Đây có thể là vấn đề cài đặt trình biên dịch. Trước tiên, bạn sẽ muốn kiểm tra xem chương trình chạy của bạn có đang ở chế độ phát hành không. Chuyển đến "Chỉnh sửa lược đồ ..." -> "Chạy" -> "Thông tin" -> "Cấu hình Xây dựng". Đảm bảo giá trị được đặt thành "Gỡ lỗi".

Nếu đó không phải là vấn đề, hãy đảm bảo rằng cài đặt bản dựng gỡ lỗi của bạn không bật tối ưu hóa trình biên dịch. Đảm bảo "Mức tối ưu hóa" được đặt thành "không" để gỡ lỗi. Ngoài ra, hãy đảm bảo không có nơi nào khác nơi mức tối ưu hóa trình biên dịch có thể được đặt, chẳng hạn như trong cài đặt "Cờ C Khác".

Các vấn đề liên quan