了解 iOS 崩溃 [SIGABRT ABORT]

use*_*748 3 sigabrt ios crashlytics swift

我刚刚从 Crashlytics 收到我的第一份崩溃报告,并正在尝试纠正该问题。不幸的是,只有一行代码可以在较旧的设备上运行,因此我无法在 iPhone 6 上对其进行测试。

Crashlytics 的崩溃报告强调了两个线程,第一个是:

Fatal Exception: NSInvalidArgumentException
-[CABasicAnimation altitude]: unrecognized selector sent to instance 0x17734440
Run Code Online (Sandbox Code Playgroud)

而第二条则是:

Crashed: Map Update :: NSOperation 0x1a839470
SIGABRT ABORT at 0x316a3dfc
Run Code Online (Sandbox Code Playgroud)

两个线程的指示代码行是:

let relativeAlt = mylocation.altitude - appDelegate.elevation
Run Code Online (Sandbox Code Playgroud)

在哪里:

let mylocation = self.mapView.myLocation
let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
Run Code Online (Sandbox Code Playgroud)

我试图了解我在崩溃报告中阅读的内容。我看它的方式程序不理解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
Run Code Online (Sandbox Code Playgroud)

第一个在我的代码中突出显示了以下行(我相信自从此测试版发布以来我一直在开发该应用程序并且行号略有变化):

self.lastLocation = (self.mapView.myLocation as CLLocation).coordinate
Run Code Online (Sandbox Code Playgroud)

虽然第二次崩溃只是给了我:

libobjc.A.dylib 
objc_msgSend + 5
Run Code Online (Sandbox Code Playgroud)

第一个新的崩溃(提供了一行代码)提供了这个报告:

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
Run Code Online (Sandbox Code Playgroud)

Oli*_*lie 5

可能不是你的问题,但我只是有一个让我发疯的 SIGABRT(这就是我最终看待这个问题的方式),我会发布我的解决方案,以防它对未来的一些洞穴探险有帮助。

在我的(iPad,无关紧要)应用程序中,您可以按下一个按钮,该按钮会导致创建一个UIViewController包含 的非全屏UITableView,并且此 viewController 通过UIPopoverController.

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

无论如何,尝试访问会newViewController.view导致该行出现 SIGABRT,但不知道问题与填充 tableView 单元格有关。堆栈跟踪中没有任何与 tableView 相关的明显内容,因此我花了很长时间来缩小范围。我最终只是猜测“可能是 tableview”并断开了IBOutlet和 delegate/dataSource 的连接以查看崩溃是否消失。

......它做到了。这让我走上了寻找真正问题的道路。

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