美文网首页iOS技术文章iOS进阶
CMFormatDescriptionRef引起的内存问题

CMFormatDescriptionRef引起的内存问题

作者: 熊皮皮 | 来源:发表于2016-07-13 17:03 被阅读426次

    本文档记录了一个因粗心导致App崩溃问题。最后确认原因是,不能CFRelease(CMFormatDescription),因为是从AVAsset中获取的而非拷贝而来。

    这是一个功能模块,在workspace中用脚本把真机及模拟器两个版本打包成Framework给他人调用,运行期间报错如下图所示。

    原始崩溃堆栈

    Xcode停留在objc_msgSend,提示EXC_BAD_ACCESS。显然,这是错误操作内存引起的。在Xcode 7.x阶段,多数人第一反应是勾上Enable Address Sanitizer,同时Scheme改为Debug模式。是的,Framework及其调用Demo都改成Debug模式,后续都执行了这个操作。

    启用Enable Address Sanitizer

    然而,启用后编译运行,没变化,还是只有简洁的EXC_BAD_ACCESS提示,无多余信息。继续配置Address Sanitizer,在Build Settings -> Other C Flags加上数据溢出时系统的行为,如下所示。

    • -f=undefined-trap
    • -fsanitize-undefined-trap-on-error
    Sanitize配置

    编译运行,问题依旧没改观,如下图所示。

    Sanitize配置后的错误提示

    按老办法,在Demo项目中启用Enable Zombie Objects,编译运行,出现一则有用的信息:野指针。

    野指针错误

    查看项目输出的日志,发现如下内容。

    CMFormatDescriptionRef

    那么,崩溃问题由CMFormatDescriptionRef引起。此时,调用栈所下所示,只是停留在消息转发时崩溃,信息量有限。

    启用僵尸对象的调用栈

    另外,在此问题的排错上,enable Address SanitizerEnable Zombie Objects同时启用与Enable Zombie Objects单独启用,表现行为一样。

    相关文章

      网友评论

      • kuai空调:作者最后解决这个问题了吗?我是在录制视频进入后台,再回到app时崩溃,同样的错误,找不到办法解决
        熊皮皮:@kuai空调 我这边确认是不能CFRelease(CMFormatDescription)
      • 子达如何:没写完?

      本文标题:CMFormatDescriptionRef引起的内存问题

      本文链接:https://www.haomeiwen.com/subject/syasjttx.html