2009-08-15 39 views
25

Sự khác biệt giữa KERN_INVALID_ADDRESSKERN_PROTECTION_FAILURE trên hệ điều hành iPhone là gì?Sự khác nhau giữa KERN_INVALID_ADDRESS và KERN_PROTECTION_FAILURE là gì?

Tôi có hai báo cáo sự cố từ một thử nghiệm beta ad-hoc mà cách nhau 5 phút và sự khác biệt chính giữa chúng (trừ các "hình ảnh nhị phân:" phần) là phần này:

Báo cáo A:

Exception Type: EXC_BAD_ACCESS (SIGBUS) 
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000008 

báo cáo B:

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x67696c69 

Đối với những gì nó có giá trị, cả hai đều có dấu vết này:

Thread 0 Crashed: 
0 libobjc.A.dylib     0x30011940 objc_msgSend + 20 
1 UIKit       0x30940174 -[UIWindow _shouldAutorotateToInterfaceOrientation:] + 60 
2 UIKit       0x30a223d8 -[UIWindow _updateToInterfaceOrientation:duration:force:] + 36 
3 UIKit       0x30958638 -[UIWindow _updateInterfaceOrientationFromDeviceOrientation] + 112 
4 UIKit       0x30942514 -[UIWindow _handleDeviceOrientationChange:] + 72 
5 Foundation      0x3054dc7a _nsnote_callback + 178 
6 CoreFoundation     0x3024ea52 _CFXNotificationPostNotification + 298 
7 Foundation      0x3054b854 -[NSNotificationCenter postNotificationName:object:userInfo:] + 64 
8 UIKit       0x309414a4 -[UIDevice setOrientation:] + 124 
9 UIKit       0x30938330 -[UIApplication handleEvent:withNewEvent:] + 5232 
10 UIKit       0x30936ce8 -[UIApplication sendEvent:] + 60 
11 UIKit       0x30936874 _UIApplicationHandleEvent + 4336 
12 GraphicsServices    0x32046964 PurpleEventCallback + 1028 
13 CoreFoundation     0x30254a70 CFRunLoopRunSpecific + 2296 
14 CoreFoundation     0x30254164 CFRunLoopRunInMode + 44 
15 GraphicsServices    0x3204529c GSEventRunModal + 188 
16 UIKit       0x308f0374 -[UIApplication _run] + 552 
17 UIKit       0x308eea8c UIApplicationMain + 960 
18 MyApp       0x00015e24 0x1000 + 85540 
19 MyApp       0x0000f138 0x1000 + 57656 

Ngoài ra, tôi không triển khai phương thức "shouldAutorotateToInterfaceOrientation:" ở bất kỳ đâu trong mã của tôi.

+1

Bạn có tìm hiểu nguyên nhân gây ra sự cố cụ thể này không? Tôi đang cố gắng để gỡ lỗi một vụ tai nạn với một backtrace gần giống hệt nhau này, và giải pháp của bạn có thể chỉ cho tôi đi đúng hướng. –

+2

Nathan, tôi không chắc chắn 100% đây là bản sửa lỗi cho vấn đề này, nhưng tôi đã sớm phát hành một UIViewController ngay lập tức từ Interface Builder. Tôi cũng đã thực hiện một số thay đổi khác, bao gồm viết lại mã làm hoạt hình giao diện trước khi phát một bộ phim thông qua MPMoviePlayerController. Vì đợt sửa lỗi này, người kiểm tra của tôi đã không báo cáo sự cố. Chúc may mắn ... cái này có thể khó theo dõi. – davidcann

+1

OK, cảm ơn những người đứng đầu David. Tôi chưa giải quyết được vấn đề, nhưng tôi đã tìm thấy hai tài nguyên mà bạn có thể quan tâm: http://sealiesoftware.com/blog/archive/2008/09/22/objc_explain_So_you_crashed_in_objc_msgSend.html http: // sealiesoftware .com/blog/archive/2009/06/08/objc_explain_So_you_crashed_in_objc_msgSend_iPhone_Edition.html –

Trả lời

41

EXC_BAD_ACCESS (SIGBUS) KERN_PROTECTION_FAILURE có nghĩa là địa chỉ ảo rõ ràng là sai: hầu hết các CPU phải truy cập bộ nhớ trên một ranh giới byte nhất định. Bởi vì truy cập dữ liệu của bạn ở đây được căn chỉnh cho một giá trị 64 bit (8), nó phải cố gắng thực hiện một lệnh tìm nạp giá trị 128 bit (chẳng hạn như so sánh và hướng dẫn trao đổi CMPXCHG16B). Trong mọi trường hợp, bạn có thể thấy từ ví dụ ở đây là 0x00000008, điều này có nghĩa là bạn đang truy cập vào phần tử cấu trúc được bù đắp 8 byte từ đầu, nhưng con trỏ cấu trúc của bạn là NULL.

EXC_BAD_ACCESS (SIGSEGV) KERN_INVALID_ADDRESS có nghĩa là địa chỉ ảo mà bạn đang tham chiếu không có trong bảng trang hoặc bạn không có quyền truy cập. Đó là địa chỉ ảo mà bạn không được phép truy cập. Đối với địa chỉ ví dụ của bạn 0x67696c69, có khả năng đây là thứ không phải là con trỏ được coi là con trỏ; hoặc cấu trúc dữ liệu của bạn có chứa con trỏ được free'd và ghi đè với các dữ liệu khác.

Ví dụ KERN_INVALID_ADDRESS của bạn, dữ liệu con trỏ đánh vần ASCII 'ilig' (bởi vì nó ít cuối cùng). Do đó bộ nhớ nơi con trỏ của bạn được lưu trữ có thể bị ghi đè bằng một số loại chuỗi.

Trong cả hai trường hợp, có thể có gì đó đã ghi đè cấu trúc dữ liệu trong UIWindow của bạn.

+0

Cảm ơn, Jared. Điều này rất hữu ích. – davidcann

+5

“… bạn đang truy cập vào phần tử cấu trúc được bù đắp 8 byte từ đầu, nhưng con trỏ cấu trúc của bạn là' NULL'. ”Một cách để thực hiện điều này là gán' nil' thành 'self', sau đó thử truy cập một cá thể biến.Điều này có thể xảy ra nhất trong các phương thức 'init', vì đó là nơi duy nhất bạn có khả năng gán cho' self'. –

+0

@PeterHosey - Con trỏ cấu trúc là gì? Cách phân bổ nil sẽ giải quyết vấn đề .. Bạn có thể giải thích được không? –

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