本文档记录了一个因粗心导致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配置后的错误提示按老办法,在Demo项目中启用Enable Zombie Objects,编译运行,出现一则有用的信息:野指针。
野指针错误查看项目输出的日志,发现如下内容。
CMFormatDescriptionRef那么,崩溃问题由CMFormatDescriptionRef引起。此时,调用栈所下所示,只是停留在消息转发时崩溃,信息量有限。
启用僵尸对象的调用栈另外,在此问题的排错上,enable Address Sanitizer和Enable Zombie Objects同时启用与Enable Zombie Objects单独启用,表现行为一样。
网友评论