VectorKit MapKit 堆栈溢出崩溃

Posted

技术标签:

【中文标题】VectorKit MapKit 堆栈溢出崩溃【英文标题】:VectorKit MapKit stack overflow crash 【发布时间】:2014-12-29 16:49:30 【问题描述】:

我们在基于地图的 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 崩溃并出现 EXC_BAD_ACCESS KERN_PROTECTION_FAILURE at 0x000000016fccbef0 错误。

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

这是完整崩溃报告的链接:http://crashes.to/s/f09eb96c753

感谢任何帮助。谢谢。

【问题讨论】:

听起来像是由于无限递归导致的堆栈溢出,问题代码位于“finally”位中。你是 MKMapView 的子类吗? 不,我们没有继承 MKMapView。我们只使用 MKMapView 的委托方法。我们只在用户点击注释时调用基本的 setRegion 方法,或者如果它们放大得太远我们将它们缩小。但即使在放大过远的情况下,我们也会缩小超过一个阈值。 IE。如果高度 如果您将委托方法更改为什么都不做会发生什么? 那么应用程序无法正常运行。这很难,因为我无法重现崩溃,我们只能在 Crashlytics 中看到它。 可能是越狱设备? 【参考方案1】:

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

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

如果上述 NSZombieEnabled 没有发现问题,请尝试使用 Static Analyzer

【讨论】:

分析仪显示没有问题。很确定不是内存问题。由于 Apple 代码的无限循环导致堆栈溢出,然后导致 EXC_BAD_ACCESS 错误。我只是不知道无限循环是如何进入的,也不知道它为什么会继续。崩溃日志在堆栈中记录的时间不够远,无法查看这一切是如何开始的。

以上是关于VectorKit MapKit 堆栈溢出崩溃的主要内容,如果未能解决你的问题,请参考以下文章

由于堆栈溢出,C 中通常会发生啥?

Xcode 9.0.1 及更高版本的 100 多个“在 MapKit 和 VectorKit 中实现的类”警告

测试浮点 NaN 会导致堆栈溢出

什么是堆栈溢出?

如何在 C++ 中处理或避免堆栈溢出

预先在运行时检测堆栈溢出