CoreLocation.ConnectionClient CFDictionaryApplyFunction Crash
在我们的程序中,一直有一类和CoreLocation模块相关的crash,在ios7.0之前的版本中,这类crash占比不是非常高,在ios7.0及以后,这种类型的crash比例突然飙升,让我们不得不对这种类型的crash加以重视了。
大体上,这类crash的最终函数栈如下:
0 libobjc.A.dylib 0x385f0626 objc_msgSend + 6 1 CoreLocation 0x2e340c24 ___lldb_unnamed_function1254$$CoreLocation + 288 2 CoreLocation 0x2e33f624 ___lldb_unnamed_function1194$$CoreLocation + 444 3 libxpc.dylib 0x38c103a8 _xpc_connection_call_event_handler + 40 4 libxpc.dylib 0x38c12e66 do_mach_notify_port_destroyed + 122 5 libxpc.dylib 0x38c12dd0 _Xmach_notify_port_destroyed + 104 6 libxpc.dylib 0x38c12d46 notify_server + 62 7 libxpc.dylib 0x38c0e9ce _xpc_connection_mach_event + 1926 8 libdispatch.dylib 0x38ad1f42 _dispatch_mach_msg_invoke + 118 9 libdispatch.dylib 0x38ad4c70 _dispatch_queue_drain + 412 10 libdispatch.dylib 0x38ad1a6a _dispatch_mach_invoke + 78 11 libdispatch.dylib 0x38ad4c70 _dispatch_queue_drain + 412 12 libdispatch.dylib 0x38ad1c6e _dispatch_queue_invoke + 42 13 libdispatch.dylib 0x38ad4c70 _dispatch_queue_drain + 412 14 libdispatch.dylib 0x38ad1c6e _dispatch_queue_invoke + 42 15 libdispatch.dylib 0x38ad55f0 _dispatch_root_queue_drain + 76 16 libdispatch.dylib 0x38ad58dc _dispatch_worker_thread2 + 56 17 libsystem_pthread.dylib 0x38c00c16 _pthread_wqthread + 298
最终crash的函数可能会有几种不同的情况,例如:CoreFoundation/CFBasicHashGetBucket,CoreFoundation/CFDictionaryApplyFunction等,但总体上引起的原因都是一致的。
这一类crash咋一看和我们自己的代码没有什么关系,这正是最让人头疼的地方,因为这会很容易让我们去和这些crash撇清关系,但基本上可以这么说,绝大多数的crash,就算函数栈中没有项目相关代码,也是由于我们自己的代码引起的,这里比较幸运的是,这一系列的crash的都和CoreLocation有关,让我和我的同事把注意力集中在这一块,项目中使用CoreLocation的地方也不多。
由于本类crash在函数栈最终有objc_msgSend的出现,基本上可以确定这是由于内存管理方面的问题引起的,对CoreLocation的使用绝大部分操作集中在对CLLocationManager的操作上,起初我们认为可能是由于我们对CLLocationManager的使用有不符合内存管理的地方,但经过一番检查以后,我们排除了这种可能性。
在网上经过一番搜索以后,我们发现有些老外也遇到了我们类似的问题,有些人解决掉了,有些则没有,有些人通过把CLLocationManager的stopUpdatingLocation的调用和将CLLocationManager的release调用延迟解决了一种类型的crash,但由于他的crash函数栈和我们的看起来很不一样,而且我认为我们遵守了apple的内存使用规范,所以我排除了这种解决方案。
于是我和xj回到我们的crash函数栈上来,尝试恢复出CoreLocation崩溃的那两个函数,但最终无果,apple应该是把相关库的符号表全都不在开放,经过一番思索,我们基本上确定该崩溃发生的原因是位置信息回调时发生的,xj说,位置信息相关的模块属于其他进程,在需要更新位置信息的时候,通过gcd和xpc进行进程间通信,把相关数据传给我们的程序进程,这一知识让我突然有了点思路。
我们的程序中也采用了这样的操作:
[CLLocationManager stopUpdatingLocation]; CLLocationManager = nil;
如果对于回调的通知是一种进程间通信,那么停止位置更新的调用,也需要一定的时间通过进程间通信的方式来通知到位置模块,而下一句操作则会在下一个runloop中把CLLocationManager相关的内存回收掉,那么这之间的时间差就很可能会让回调发生时访问一段无效的内存,那么之前网络上关于延迟release CLLocationManager的操作就也能站得住脚了。有了这样的结论,改起来就容易了,其实关于CLLocationManager,整个程序用一个就行了,不需要进行回收,在相应的需求下调用相应的start和stop操作就能够控制位置更新。
后经验证,在最新的版本中,这一类型的crash已经解决。
转载于:https://blog.51cto.com/ljianbing/1846398
CoreLocation.ConnectionClient CFDictionaryApplyFunction Crash相关推荐
- crash日志学习(初步)
//1.进程信息:这部分是闪退进程的相关信息 //崩溃报告的唯一标识符,用以标识不同的崩溃信息 Incident Identifier: C8F7C4F0-2F16-47AC-BD37-43A87 ...
- ADB 查看 crash log
有时候项目Crash 了, 我们可以使用adb 查看crash 信息 在终端中输入 adb shell 然后就是查看crash 命令 logcat -b crash 这样就能查看crash 的地方了.
- Android 你知道界面布局嵌套多少层之后会Crash吗
我们先放一张Hierarchy Viewer的图:(模拟器Android4.4) 看到数字6了吗,那个RelativeLayout是MainActivity的根ViewGroup, 而在Relativ ...
- 系统crash无法启动 tpm error / could not read size 0x8000000e
系统crash无法启动 tpm error / couldn't read size 0x8000000e 原文连接: https://unix.stackexchange.com/questions ...
- IOS中CoreLocation框架地理定位
1.CoreLocation框架使用前提: #import <CoreLocation/CoreLocation.h> CoreLocation框架中所有数据类型的前缀都是CL ,Core ...
- google breakpad native crash分析工具
一. BreakPad简介 Google breakpad是一个跨平台的崩溃转储和分析框架和工具集合. Breakpad由三个主要组件: client,以library的形式内置在你的应用中,当崩溃发 ...
- NDK crash栈信息的错误定位
Android NDK是什么,为什么我们要用NDK? Android NDK 是在SDK前面又加上了"原生"二字,即Native Development Kit,因此又被Googl ...
- iOS crash日志分析
项目集成talkingdata收集到的crash日志, 看到那些日志时自己也是很崩溃, 全是内存地址, 根本搞不懂项目到底crash到了那里, 比如这样: 自己在网上找了很多方法, 以下是自己最后所用 ...
- iOS 利用dSYM定位crash
What is dSYM ? xCode 的每一次编译都会生成一个dsym文件,在其内部存储了16进制函数地址的映射. 在App实际执行的二进制文件中,是通过地址来调用方法,所以在App Crash ...
最新文章
- mysql 数据库的导入和导出
- 0.0 Introduction-机器学习笔记-斯坦福吴恩达教授
- 内存扩展算法 linux,Linux下内存的使用率正确的算法
- SQL2005 数据库数据同步
- jpa 实体图查询_JPA实体图
- arm linux gif 显示_100ASK_IMX6ULL arm板子如何显示图片、汉字、划线、背景色
- [原创]django+ldap实现统一认证部分一(django-auth-ldap实践)
- MongoDB数据访问[C#]
- [Java] 蓝桥杯ADV-178 算法提高 简单加法
- 如何求两个矢量间的夹角
- Product of Array Except Self
- eclipse如何设置断点断点处运行快捷键
- ffmpeg音频转换命令
- RM2016视觉开源OpenCv2代码
- 腾讯程序员的职业晋升答辩之【完全解析】
- another app is currently holding the yum lock;waiting for it to exit
- 任天堂(Nintendo)(什么是ps4,什么是ns(switch))
- 一款好玩的关联微信运动的云遛狗微信小程序
- 电子秤称重系统设计,HX711压力传感器,51单片机(Proteus仿真、C程序、原理图、论文等全套资料)
- 【Flutter实战 BLoC模式 RxDart Provider模式】