本文档记录了一个因粗心导致App崩溃问题。最后确认原因是,不能CFRelease(CMFormatDescription),因为是从AVAsset中获取的而非拷贝而来。
这是一个功能模块,在workspace中用脚本把真机及模拟器两个版本打包成Framework给他人调用,运行期间报错如下图所示。
![](https://img.haomeiwen.com/i1613657/a92fc5140027f2cd.png)
Xcode停留在objc_msgSend,提示EXC_BAD_ACCESS。显然,这是错误操作内存引起的。在Xcode 7.x阶段,多数人第一反应是勾上Enable Address Sanitizer,同时Scheme改为Debug模式。是的,Framework及其调用Demo都改成Debug模式,后续都执行了这个操作。
![](https://img.haomeiwen.com/i1613657/0d90e238ecca88d1.png)
然而,启用后编译运行,没变化,还是只有简洁的EXC_BAD_ACCESS提示,无多余信息。继续配置Address Sanitizer,在Build Settings -> Other C Flags加上数据溢出时系统的行为,如下所示。
-f=undefined-trap
-fsanitize-undefined-trap-on-error
![](https://img.haomeiwen.com/i1613657/d1a03560f17aad54.png)
编译运行,问题依旧没改观,如下图所示。
![](https://img.haomeiwen.com/i1613657/0edfcc5bf40afb6b.png)
按老办法,在Demo项目中启用Enable Zombie Objects,编译运行,出现一则有用的信息:野指针。
![](https://img.haomeiwen.com/i1613657/aa052f69813e0c5b.png)
查看项目输出的日志,发现如下内容。
![](https://img.haomeiwen.com/i1613657/9d43703a5bd12c85.png)
那么,崩溃问题由CMFormatDescriptionRef引起。此时,调用栈所下所示,只是停留在消息转发时崩溃,信息量有限。
![](https://img.haomeiwen.com/i1613657/42d14d2ec70d197e.png)
另外,在此问题的排错上,enable Address Sanitizer和Enable Zombie Objects同时启用与Enable Zombie Objects单独启用,表现行为一样。
网友评论