2009-08-15 2 views
25

В чем разница между KERN_INVALID_ADDRESS и KERN_PROTECTION_FAILURE на iPhone OS?В чем разница между KERN_INVALID_ADDRESS и KERN_PROTECTION_FAILURE?

У меня есть два сообщения о сбоях из одноранговой бета-тестера, которые 5 минут друг от друга и главное различие между ними (кроме «двоичных изображений:» раздел) этот раздел:

Report 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

Вы узнали, что вызвало эту проблему? Я пытаюсь отладить крах с почти идентичным обратным каналом, и ваше решение может указать мне в правильном направлении. –

+2

Nathan, я не уверен на 100%, это было исправление этой проблемы, но я преждевременно выпускал UIViewController, созданный из Interface Builder. Я также сделал несколько других изменений, включая переписывание кода, который анимирует интерфейс перед воспроизведением фильма через MPMoviePlayerController. Поскольку эта серия исправлений, мои тестеры не сообщили об этой проблеме. Удачи ... этого может быть трудно отследить. – davidcann

+1

Хорошо, спасибо за головы Дэвида. Я еще, чтобы решить эту проблему, но я нашел два ресурса, вы можете быть заинтересованы в: 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 –

ответ

41

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.

+0

Спасибо, Джаред. Это полезно. – davidcann

+5

«... вы получаете доступ к элементу структуры, который смещен с 8 байтами с начала, но ваш указатель структуры« NULL ». Один из способов сделать это - присвоить' nil' 'self', затем попытаться получить доступ к экземпляру переменная.Это наиболее вероятно в методах 'init', так как это единственное место, которое вы, вероятно, назначаете' self'. –

+0

@PeterHosey - Что такое указатель структуры? Как назначить нуль решить проблему. Можете ли вы объяснить, пожалуйста? –

Смежные вопросы