Какая разница между KERN_INVALID_ADDRESS и KERN_PROTECTION_FAILURE?
В чем разница между KERN_INVALID_ADDRESS
и KERN_PROTECTION_FAILURE
на iPhone OS?
У меня есть два отчета о сбоях от специального бета-тестера, которые находятся на расстоянии 5 минут, и основное различие между ними (кроме раздела "Двоичные изображения:" ) - это раздел:
Отчет A:
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000008
Отчет B:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x67696c69
Для чего это стоит, у обоих есть такая трассировка:
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
Кроме того, я не реализую метод "shouldAutorotateToInterfaceOrientation:" в любом месте моего кода.
Ответы
Ответ 1
EXC_BAD_ACCESS (SIGBUS) KERN_PROTECTION_FAILURE
означает, что виртуальный адрес явно ошибочен: большинство процессоров должны иметь доступ к памяти на определенной границе байта. Поскольку ваш доступ к данным здесь выровнен для 64-битного значения (8), он должен попытаться выполнить команду, которая извлекает 128-битное значение (например, команду сравнения и обмена CMPXCHG16B
). В любом случае вы можете увидеть из примера здесь, что это 0x00000008
, что, вероятно, означает, что вы обращаетесь к элементу структуры, который смещает 8 байтов с начала, но ваш указатель структуры NULL
.
EXC_BAD_ACCESS (SIGSEGV) KERN_INVALID_ADDRESS
означает, что виртуальный адрес, на который вы ссылаетесь, не находится в таблицах страниц или у вас нет доступа. Это виртуальный адрес, к которому вам не разрешен доступ. Для вашего адреса адреса адреса 0x67696c69
вероятно, что это то, что не является указателем, который обрабатывался как указатель; или ваша структура данных, содержащая указатель, была свободна и перезаписана другими данными.
Для вашего примера KERN_INVALID_ADDRESS
данные указателя указывают на ASCII 'ilig' (потому что это немного endian). Поэтому память, в которой был сохранен ваш указатель, скорее всего, была перезаписана какой-то строкой.
В обоих случаях, вероятно, что что-то перезаписало структуры данных в UIWindow
.