记一次高级调试错误(附高级调试方法)
1.BUG现象:
问题描述:返回一个UIColor对象时报错,[UIColor redColor]时不报错,[UIColor colorWithRGB]时报错,编译器不报告具体问题,不报告具体位置,仅仅显示EXC_BAD_ACCESS(code=EXC_I386_GPFLT)
初步推测:一个内存引用计数为1的对象被release了两次,机制不明,原因不明
2.排查方法
1)在图示位置添加 MallocStackLoggingNoCompact NSZombieEnabled MallocStackLogging 三个环境变量并设置值为YES
2)再次运行程序,点击到BUG点,IDE会输出下面这个字段
其中0x7ffbc2697820为当前出现BUG的内存地址,我们需要查看该地址的malloc history
3)在活动监视器里找到当前程序的PID(28456)
4)现在,我们得到了两个主要的信息:
进程ID:28456
崩溃地址:0x7ffbc2697820
打开终端,输入(格式:malloc_history PID 内存地址)
malloc_history 28456 0x7ffbc2697820
5)终端显示
6)根据最后执行的方法,推断出是属性问题,即
assign不能用来修饰非基本类型,改为strong