测试描述
项目合成了思必驰的语音项目,测试在测试的过程中发觉app置于后台一段时间后,再切换回前台,就会出现语音图标点击没有反应,然后崩溃....
猜测
我开始猜测会不会是由于哪里出现了死循环导致点击没有反应最后崩溃,但是又想如果死循环的话应该整个页面都是卡死的,不应该只有整个按钮点击了没有反应。。。头都想大了,还是想如何才会操作出这样的场景
调试
反复重复测试的描述步棸,我发觉app至于后台一段时间后返回,界面会有卡顿,立马通过memory
查看,果不其然内存有问题:
于是直接运行查看memory
,发觉会不停的增长,经过一系列代码的分析终于找到内存增长的代码。
于是就想随他涨,看看涨到多少会调用applicationDidReceiveMemoryWarning
,很不幸,尝试了很多次,才调用这个地方,而且很不稳定,有时候memory
已经很大了达到200M以上了还每调用
接下来,又开始反复重复测试的步骤,发觉当调用applicationDidReceiveMemoryWarning
的时候,切换回前台, 那个按钮点击是必然会出现上诉情况,只是按钮方法是响应的,UI并没有变化,而且其他界面跳转在memory
值大的情况下会卡顿
一次,一次,又一次还是复现不出测试描述的结果,都快绝望了,就在下班前,出现了希望,*复现了,复现了,复现了,只见控制台输出如下:
malloc: Heap corruption detected, free list is damaged at 0x2830c7fa0
*** Incorrect guard value: 0
回想刚才的操作:
- 内存增长的先不管, 运行之后至于后台
- 一段时间后切换回前台
-
applicationDidReceiveMemoryWarning
调用了,并且出现了测试描述的情况,切面切换还没达到卡顿,但是按钮点击UI已经不会变化了
再看崩溃的地方:
结合崩溃信息:
最终可以判断:
是由于长时间至于后台,语音SDK处理close,导致按钮点击后UI没有变化,另一边由于内存持续增长,并触发了applicationDidReceiveMemoryWarning
,导致系统释放了部分 堆
,这个时候app 调接口再去访问这个释放的堆
空间,立马就崩溃了