2014-09-05 35 views
25

MyApp hoạt động tốt trong 98% thời gian, nhưng đôi khi nó hiển thị sự cố. Và nó rất ngẫu nhiên.Tai nạn ios EXC_BAD_ACCESS KERN_INVALID_ADDRESS

Báo cáo sự cố hiển thị thông tin sau.

Thread : Crashed: com.apple.main-thread 
0 libobjc.A.dylib    0x3b1ae626 objc_msgSend + 5 
1 Foundation      0x310e2381 _netServiceMonitorCallBack + 104 
2 CFNetwork      0x302ea3b5 _QueryRecordReply(_DNSServiceRef_t*, unsigned int, unsigned int, int, char const*, unsigned short, unsigned short, unsigned short, void const*, unsigned int, void*) + 324 
3 libsystem_dnssd.dylib   0x3b7289d9 handle_query_response + 168 
4 libsystem_dnssd.dylib   0x3b72773f DNSServiceProcessResult + 582 
5 CFNetwork      0x302ea3e5 _SocketCallBack_Mon(__CFSocket*, unsigned long, __CFData const*, void const*, void*) + 20 
6 CoreFoundation     0x30691189 __CFSocketPerformV0 + 580 
7 CoreFoundation     0x3068efaf __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14 
8 CoreFoundation     0x3068e477 __CFRunLoopDoSources0 + 206 
9 CoreFoundation     0x3068cc67 __CFRunLoopRun + 630 
10 CoreFoundation     0x305f7729 CFRunLoopRunSpecific + 524 
11 CoreFoundation     0x305f750b CFRunLoopRunInMode + 106 
12 GraphicsServices    0x355336d3 GSEventRunModal + 138 
13 UIKit       0x32f58871 UIApplicationMain + 1136 
14 MyApp       0x0013f813 main (main.m:16) 

Tất cả các phương pháp nội bộ này đều nhìn. Tôi trải nghiệm những sự cố này trên iPad 4 chạy iOS 7.1.2. Làm thế nào tôi có thể làm móng nó xuống. Tất cả đều giúp đánh giá cao.

+1

Các đầu báo cáo tai nạn xin vui lòng. Đặc biệt là mã ngoại lệ. Có phải '0xbadfood' không? – orkoden

+0

Không có mã ngoại lệ là 0xf000000c, 0x0000000f. Cả hai sự cố đều có cùng một ngăn xếp. –

+0

sử dụng ExceptionHandler, xem câu trả lời của tôi tại đây: http://stackoverflow.com/questions/10501358/objective-c-getting-line-number-or-full-stack-trace-from-debugger-error/25551171#25551171 –

Trả lời

20

Tai nạn này xảy ra do rò rỉ bộ nhớ. Khi bất kỳ biến hoặc đối tượng nào đang cố truy cập bộ nhớ bị hạn chế thì sự cố này xảy ra.

+5

Có thể là do gửi tin nhắn đến một đối tượng đã được phát hành. Nhưng nhìn vào dấu vết ngăn xếp tôi không hiểu nơi nó có thể đã đi sai và dự án hoàn toàn trong ARC. –

+2

Sử dụng bất kỳ khối nào? – stevesliva

+1

@stevesliva tại sao các chặn sẽ là vấn đề ở đây?[Tôi đang sử dụng chúng và tôi gặp lỗi tương tự] – ripegooseberry

11

Đây là câu hỏi cũ nhưng sự cố EXC_BAD_ACCESS KERN_INVALID_ADDRESS không phải do rò rỉ bộ nhớ, mà là do cố gắng truy cập đối tượng được phân bổ. Vì bộ nhớ của đối tượng deallocated bây giờ có thể bị chiếm bởi một đối tượng thuộc kiểu khác, dòng cuối cùng trong ngăn xếp sự cố có thể dẫn đến sai vì nó không thực sự là một phần của đường dẫn thực hiện được lập trình của bạn, vì vậy thường chúng ta cần tìm kiếm một chút. Tuy nhiên, dấu vết ngăn xếp được đăng bởi @Sj chỉ bao gồm các cuộc gọi hệ thống để nó thực sự khó khăn. Nếu điều này được tạo ra trong một phiên gỡ lỗi, việc thêm điểm ngắt "Tất cả ngoại lệ" có thể giúp tạo ra một dấu vết ngăn xếp nhiều thông tin hơn.

+0

Cảm ơn bạn đã chỉ ra. Yeah, nó không phải do rò rỉ bộ nhớ. stevesliva đã thêm một bình luận đã giúp. Đó là do các khối và đối tượng được phát hành sớm. Đó là lý do tại sao dấu vết ngăn xếp cũng không rõ ràng. –

-2

Tai nạn EXC_BAD_ACCESS KERN_INVALID_ADDRESS không phải do rò rỉ bộ nhớ, nhưng do cố gắng truy cập đối tượng được phân phối.

Ví dụ: nếu bạn sử dụng__weak typeof(self) weakSelf = self; và đối tượng đã được phát hành trước khi bạn truy cập vào nó bên trong khối bạn sẽ nhận được sự sụp đổ. Lý do - truy cập vào địa chỉ bộ nhớ sai vì đối tượng đã được deallocated.

Để ngăn việc sử dụng này __strong typeof(self) strongSelf = self; bên trong khối. Nil giá trị sẽ được xử lý đúng mà không sụp đổ


Lưu ý: sử dụng mẫu mã này cho công việc nhanh.

#define weakify(var) __weak typeof(var) AHKWeak_##var = var; 

#define strongify(var) \ 
_Pragma("clang diagnostic push") \ 
_Pragma("clang diagnostic ignored \"-Wshadow\"") \ 
__strong typeof(var) var = AHKWeak_##var; \ 
_Pragma("clang diagnostic pop") 

Cách sử dụng Ví dụ:

weakify(self); // Remove retain cycle 
[self someFunctionWithBlock:^{ 
    strongify(self); // Make reference to address valid 

}]; 
+0

Điều này không chính xác; nhắn tin một 'nil' weakSelf giống như nhắn tin bất kỳ' nil' nào khác trong ObjC, nó là một no-op và tốt để làm. Bạn chỉ cần 'strongify' tham chiếu yếu nếu bạn định gửi nhiều thông điệp, để đảm bảo nó không bị chia nhỏ. – buildsucceeded

+0

Có lẽ tôi đã không mô tả rõ ràng, nhưng bạn lặp lại ý tưởng của tôi, tôi đồng ý với bạn. – akaDuality

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