在我们的程序中,一直有一类和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相关推荐

  1. crash日志学习(初步)

    //1.进程信息:这部分是闪退进程的相关信息  //崩溃报告的唯一标识符,用以标识不同的崩溃信息  Incident Identifier: C8F7C4F0-2F16-47AC-BD37-43A87 ...

  2. ADB 查看 crash log

    有时候项目Crash 了, 我们可以使用adb 查看crash 信息 在终端中输入 adb shell 然后就是查看crash 命令 logcat -b crash 这样就能查看crash 的地方了.

  3. Android 你知道界面布局嵌套多少层之后会Crash吗

    我们先放一张Hierarchy Viewer的图:(模拟器Android4.4) 看到数字6了吗,那个RelativeLayout是MainActivity的根ViewGroup, 而在Relativ ...

  4. 系统crash无法启动 tpm error / could not read size 0x8000000e

    系统crash无法启动 tpm error / couldn't read size 0x8000000e 原文连接: https://unix.stackexchange.com/questions ...

  5. IOS中CoreLocation框架地理定位

    1.CoreLocation框架使用前提: #import <CoreLocation/CoreLocation.h> CoreLocation框架中所有数据类型的前缀都是CL ,Core ...

  6. google breakpad native crash分析工具

    一. BreakPad简介 Google breakpad是一个跨平台的崩溃转储和分析框架和工具集合. Breakpad由三个主要组件: client,以library的形式内置在你的应用中,当崩溃发 ...

  7. NDK crash栈信息的错误定位

    Android NDK是什么,为什么我们要用NDK? Android NDK 是在SDK前面又加上了"原生"二字,即Native Development Kit,因此又被Googl ...

  8. iOS crash日志分析

    项目集成talkingdata收集到的crash日志, 看到那些日志时自己也是很崩溃, 全是内存地址, 根本搞不懂项目到底crash到了那里, 比如这样: 自己在网上找了很多方法, 以下是自己最后所用 ...

  9. iOS 利用dSYM定位crash

    What is dSYM ? xCode 的每一次编译都会生成一个dsym文件,在其内部存储了16进制函数地址的映射. 在App实际执行的二进制文件中,是通过地址来调用方法,所以在App Crash ...

最新文章

  1. mysql 数据库的导入和导出
  2. 0.0 Introduction-机器学习笔记-斯坦福吴恩达教授
  3. 内存扩展算法 linux,Linux下内存的使用率正确的算法
  4. SQL2005 数据库数据同步
  5. jpa 实体图查询_JPA实体图
  6. arm linux gif 显示_100ASK_IMX6ULL arm板子如何显示图片、汉字、划线、背景色
  7. [原创]django+ldap实现统一认证部分一(django-auth-ldap实践)
  8. MongoDB数据访问[C#]
  9. [Java] 蓝桥杯ADV-178 算法提高 简单加法
  10. 如何求两个矢量间的夹角
  11. Product of Array Except Self
  12. eclipse如何设置断点断点处运行快捷键
  13. ffmpeg音频转换命令
  14. RM2016视觉开源OpenCv2代码
  15. 腾讯程序员的职业晋升答辩之【完全解析】
  16. another app is currently holding the yum lock;waiting for it to exit
  17. 任天堂(Nintendo)(什么是ps4,什么是ns(switch))
  18. 一款好玩的关联微信运动的云遛狗微信小程序
  19. 电子秤称重系统设计,HX711压力传感器,51单片机(Proteus仿真、C程序、原理图、论文等全套资料)
  20. 【Flutter实战 BLoC模式 RxDart Provider模式】

热门文章

  1. 快速求区间和的有趣算法——树状数组
  2. 算法导论读书笔记-第十九章-斐波那契堆
  3. 【HDOJ 3652】B-number
  4. JNI命令行下编译错误解决方案
  5. 面向对象设计:共性VS个性-------继承的粒度和聚合的粒度以及类的重构
  6. 【项目】MD5加盐源码理解
  7. android好用的第三方库2018使用总结
  8. Java任务调度框架Quartz
  9. boost::bind的使用
  10. 基于bmob的校园资料分享互助平台