Ios VectorKit MapKit堆栈溢出崩溃

Ios VectorKit MapKit堆栈溢出崩溃,ios,objective-c,crash,ios8,mapkit,Ios,Objective C,Crash,Ios8,Mapkit,我们在基于地图的iOS应用程序中看到了一个奇怪的崩溃,我无法理解。基本上,以下几行代码在崩溃日志中重复了100多次: 6 VectorKit 0x000000019050c6f8 __86-[VKMapCameraController _animateToPosition:pitch:yaw:duration:timingCurve:completion:]_block_invoke347 + 40 7 VectorKit

我们在基于地图的iOS应用程序中看到了一个奇怪的崩溃,我无法理解。基本上,以下几行代码在崩溃日志中重复了100多次:

6   VectorKit                      0x000000019050c6f8 __86-[VKMapCameraController _animateToPosition:pitch:yaw:duration:timingCurve:completion:]_block_invoke347 + 40
7   VectorKit                      0x0000000190485a30 -[VKAnimation _stopAnimation:] + 140
8   VectorKit                      0x0000000190488b20 -[VKMapCameraController setYaw:animated:] + 100
9   MapKit                         0x000000018540263c -[MKMapView snapToNorth:] + 148
在最后打电话之前:

0   CoreFoundation                 0x0000000183251e38 _CFArrayReplaceValues + 152
1   CoreFoundation                 0x000000018332876c __CFRepositionTimerInMode + 108
2   CoreFoundation                 0x000000018332876c __CFRepositionTimerInMode + 108
3   CoreFoundation                 0x0000000183272630 CFRunLoopTimerSetNextFireDate + 580
4   MapKit                         0x00000001853e8588 -[MKMapView _didChangeRegionMidstream:] + 196
5   MapKit                         0x0000000185404e90 -[MKMapView mapLayer:didChangeRegionAnimated:] + 60
其中,_CGArrayReplaceValues在0x000000016fccbef0错误处因EXC_坏访问内核保护_故障而崩溃

我想指出,我们从未直接调用本崩溃报告中的任何方法,事实上VectorKit是完全私有的Apple框架。我们在应用程序中所做的唯一一件与远程相关的事情就是调用基本的setRegion:animated:methods,通常是在用户点击注释以集中在所述注释之后。还值得指出的是,这只发生在iOS 8上。没有任何iOS 7崩溃的报告

以下是完整碰撞报告的链接:


感谢您的帮助。谢谢。

尝试启用NSZombieEnabled。一旦启用,当一个对象达到保留计数0时,它不会被解除分配,而是将自身变形为一个NSZombie实例。当僵尸收到消息时,它将记录一条警告,而不是崩溃或以不可预知的方式行为

老实说,我不太清楚为什么这只是在iOS 8上崩溃,而不是在iOS 7上崩溃,但是EXC_BAD_ACCESS信号是向系统调用传递无效指针的结果,因此您可能在某处取消引用空指针


如果上述NSZombieEnabled没有发现问题,请尝试使用静态分析器

听起来像是无限递归导致的堆栈溢出,问题代码位于“finally”位的某个位置。你有没有子类MKMapView?没有,我们没有子类MKMapView。我们只使用MKMapView的委托方法。在那里,我们只在用户点击注释时调用基本的setRegion方法,或者如果它们放大得太远,我们就缩小它们。但即使在放大太远的情况下,我们也会缩小超过阈值。也就是说,如果海拔高度小于100,我们将缩小到115以避免地图挑剔行为。如果将代理方法更改为“不做任何事情”,会发生什么?那么应用程序就无法正常运行。这很难,因为我无法重现崩溃,我们只能在Crashlytics中看到它。可能是越狱设备?分析仪显示没有问题。很确定不是内存问题。这是由于Apple代码无休止的循环导致的堆栈溢出,然后导致EXC_BAD_访问错误。我只是不知道这个无休止的循环是如何进入的,也不知道为什么它还在继续。崩溃日志在堆栈中记录的距离不够远,无法查看它是如何开始的。