2015-01-18 4 views
2

Я только что получил свой первый отчет о сбоях Crashlytics и пытаюсь исправить проблему. К сожалению, это только строки кода, который работает на старых устройствах, так что я не могу проверить это на моем iPhone 6.Понимание iOS Crash [SIGABRT ABORT]

В докладе аварии из Crashlytics выделяет две темы, первая гласит:

Fatal Exception: NSInvalidArgumentException 
-[CABasicAnimation altitude]: unrecognized selector sent to instance 0x17734440 

в то время как вторая гласит:

Crashed: Map Update :: NSOperation 0x1a839470 
SIGABRT ABORT at 0x316a3dfc 

указанная строка кода для обеих нитей:

let relativeAlt = mylocation.altitude - appDelegate.elevation 

Где:

let mylocation = self.mapView.myLocation 
let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) 

Я пытаюсь понять, что я читаю в отчете об аварии. Как я вижу, программа не понимает ссылку altitude по какой-то причине? Это не имеет смысла для меня, поскольку этот сбой, кажется, происходит после того, как это приложение работает в течение нескольких минут без ошибок, выделенная строка кода запускается, возможно, сотни раз до того, как приложение разбилось. Что на самом деле происходит здесь?

Дополнительная информация:

Поскольку письма, я получил дополнительные аварии, которые я считаю проистекают из того же вопроса:

Crashed: Map Update :: NSOperation 0x19fb2d50 
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x11d077ca 

Crashed: Map Update :: NSOperation 0x145ced50 
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x81450a64 

Первый выделенному следующую строку в своем коде (я считаю, так как я работал на приложение с этого бета-версии и номера строк немного изменились):

self.lastLocation = (self.mapView.myLocation as CLLocation).coordinate 

Хотя второй аварии просто дал мне:

libobjc.A.dylib 
objc_msgSend + 5 

Первый из новых аварий (Это обеспечило строку коды) при условии, этот отчета:

Thread : Crashed: Map Update :: NSOperation 0x19fb2d50 
0 libobjc.A.dylib    0x3105c708 objc_release + 7 
1 FlightTracker     0x000ba830 FlightTracker.MapViewController. (locationManager (FlightTracker.MapViewController) -> (Swift.ImplicitlyUnwrappedOptional<ObjectiveC.CLLocationManager>, didUpdateLocations : Swift.ImplicitlyUnwrappedOptional<Swift.Array<Swift.AnyObject>>) ->()).(closure #1) (MapViewController.swift:168) 
2 Foundation      0x244ce0fd __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__ + 8 
3 Foundation      0x24438fc5 -[NSBlockOperation main] + 148 
4 Foundation      0x2442b845 -[__NSOperationInternal _start:] + 768 
5 Foundation      0x244d0a57 __NSOQSchedule_f + 186 
6 libdispatch.dylib    0x315ad5d9 _dispatch_queue_drain$VARIANT$mp + 948 
7 libdispatch.dylib    0x315ad0a9 _dispatch_queue_invoke$VARIANT$mp + 84 
8 libdispatch.dylib    0x315af0d3 _dispatch_root_queue_drain + 330 
9 libdispatch.dylib    0x315b01fb _dispatch_worker_thread3 + 106 
10 libsystem_pthread.dylib  0x31720e25 _pthread_wqthread + 668 
+1

Исключение говорит о том, что вы вызывали 'высоту' на объект' CABasicAnimation', который он не поддерживает. Это указывает на то, что вы, вероятно, вызывают метод на выпущенном объекте, и эта память теперь повторно используется для 'CABasicAnimation'. Откуда появляется свойство myLocation? Вашего вида карты? Он не является свойством 'MKMapView' – Paulw11

+0

' myLocation' является свойством формы 'CLLocation! ', Унаследованной от API iOS Google Maps. Если объект был выпущен, это может иметь смысл, учитывая, что устройство имело только 14 МБ ОЗУ, доступное, когда устройство разбилось. – user3185748

+0

@ user3185748 Вы объявили 'let mylocation' локально внутри того же метода, что и' let relativeAlt = mylocation.altitude - appDelegate.elevation'? –

ответ

1

Из-за отсутствия полного/надлежащего отчет аварии и отсутствие дополнительного кода и архитектуры, следующее является предположением, использующим небольшие бит информации, которые доступны.

Вы получаете доступ к переменной в фоновом потоке (очередь NSOperation), которая была выпущена в другом потоке и теперь больше не доступна, поэтому указатель показывает какой-либо другой случайный объект в памяти. И этот случайный объект, конечно, не имеет понятия, что делать с сообщением altitude, которое затем вызывает сбой.

Вы должны убедиться, что все переменные, используемые в фоновом потоке, доступны и не выпущены в другом потоке.

+0

спасибо, что нашли время ответить. Я объединил вопросы выше. Я также предоставил трассировку стека из одной из недавних сбоев.Кроме того, я понимаю, что вы не можете освободить объект с помощью Swift, это правильно? Если бы это было так, я не понимаю, как данная переменная может исчезнуть в другом потоке. – user3185748

4

Возможно, это не ваша проблема, но у меня только что был SIGABRT, который заводил меня орехами (вот как я в конечном итоге посмотрел на этот вопрос), и я отправлю свое решение на случай, если это поможет будущему S.O. спелеолог.

В моем (IPAD, не то, что это особенно важно) приложении, вы можете нажать на кнопку, которая приводит к созданию не-полноэкранного UIViewController, который содержит UITableView, и это ViewController представлен через UIPopoverController.

В моем случае у меня была ошибка в моей загрузке элементов tableView, которые во время создания ячейки tableView я попытался добавить нулевое значение в словарь. (Это длинный рассказ, связанный с классом инфраструктуры, который ожидает, что данные будут в определенном формате.)

В любом случае попытка доступа к newViewController.view вызвала SIGABRT на этой линии, без подсказки, что проблема была связана для заполнения ячейки tableView. Ничто tableView-related не было видно в трассировке стека, поэтому мне потребовалось некоторое время, чтобы сузить дело. В конце концов я просто догадался «возможно, это табличное представление» и отключил IBOutlet и делегировать/dataSource, чтобы узнать, исчез ли крушение.

... И это было. Что привело меня по пути поиска реальной проблемы.

В любом случае, это моя история. Надеюсь, это кому-то поможет.

0

Вау, у меня просто было другое решение «невозможно отследить», которое привело меня в бешенство.

Раньше в тот же день я сделал большой рефакторинг, так как некоторые объекты в моей игре имели такие имена, как RFCFoo, а некоторые были как RfcBar, и я хотел стандартизировать капитализацию.

Так что я использовал Refactor->Rename... инструмент Xcode, и он работал большой, за исключением одной вещи:

Это не удалось переименовать один конкретный .xib файл, который остался в «RFCBlahBlah.xib», когда я пытаюсь загрузить его как «RfcBlahBlah.xib»

Опять же, я надеюсь, что это окажется полезным для будущего поисковика SO.