了解iOS崩溃[SIGABRT ABORT]

时间:2015-01-18 19:45:08

标签: ios swift sigabrt crashlytics

我刚从Crashlytics收到我的第一份崩溃报告,并试图纠正这个问题。不幸的是,只有一行代码在旧设备上运行,所以我无法在iPhone 6上测试它。

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

3 个答案:

答案 0 :(得分:4)

可能不是你的问题,但我只是有一个让我疯狂的SIGABRT(这就是我最终看到这个问题的方式)并且我将发布我的解决方案,以防它有助于未来的S.O. spelunker。

在我的(iPad,不重要)应用程序中,您可以按下一个按钮,导致创建一个包含UIViewController的非全屏UITableView,此viewController是通过UIPopoverController提供。

在我的情况下,我在加载tableView项目时搞砸了,在创建tableView单元格时,我最终尝试将空值添加到字典中。 (这是一个很长的故事,与基础设施类有关,期望数据采用某种格式。)

无论如何,尝试访问newViewController.view导致该行上的SIGABRT,并不知道该问题与填充tableView单元格有关。堆栈跟踪中没有任何与tableView相关的内容,因此我需要花费很长时间来缩小范围。我最终猜到“也许是桌面视图”并断开IBOutlet和委托/ dataSource以查看崩溃是否消失。

......确实如此。这导致我找到了真正的问题。

无论如何,这是我的故事。希望它对某人有帮助。

答案 1 :(得分:2)

由于缺乏完整/正确的崩溃报告以及缺少更多代码和架构,以下是使用可用信息的假设。

您正在访问在另一个线程上释放的后台线程(NSOperation队列)中的变量,现在不再可用,因此指针会显示内存中的其他随机对象。并且该随机对象肯定不知道如何处理导致崩溃的altitude消息。

您必须确保后台线程中使用的所有变量都可用,而不是在另一个线程中发布。

答案 2 :(得分:2)

哇,我刚才有另一个&#34;无法追查&#34;对此的解决方案让我疯狂。

当天早些时候,我做了一个主要的重构,因为我游戏中的一些对象的名称如{'Rating': u'4', 'Brewery': u'Tr\xf6egs Brewing Company', 'Beer name': u'Tr\xf6egs Hopback Amber Ale'} {'Rating': u'4.59', 'Brewery': u'Brasserie Dieu Du Ciel', 'Beer name': u'P\xe9ch\xe9 Mortel - Bourbon Barrel Aged'} ,有些像RFCFoo,我想标准化大小写。

所以我使用了XCode的RfcBar工具,除了一件事以外它运行得很好:

无法重命名一个特定的.xib文件,该文件保留为&#34; RFCBlahBlah.xib&#34;当我试图将它加载为&#34; RfcBlahBlah.xib&#34;

同样,我希望这证明对未来的SO搜索者有用。