我的代码中突然出现了奇怪的Malloc错误,例如:
malloc: *** error for object 0x7fbdc8daa2f8: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
当我设置断点时,它们似乎是随机的,只是出现在不同的地方。我在XCode 8.1上。 Swift 3.0。有人遇到过这个吗?
我设置了断点,我明白了:
libsystem_malloc.dylib`malloc_error_break:
-> 0x112fa4760 <+0>: pushq %rbp
0x112fa4761 <+1>: movq %rsp, %rbp
0x112fa4764 <+4>: nop
0x112fa4765 <+5>: nopl (%rax)
0x112fa4769 <+9>: popq %rbp
0x112fa476a <+10>: retq
答案 0 :(得分:4)
此错误的最常见原因是线程违规。例如,如果一个线程在对象上执行最终版本并开始释放它,然后另一个对该对象具有unowned
(Swift)或assign
(ObjC)引用的线程修改它,这将触发此错误。 (如果所有引用都是strong
或weak
,则不应该出现此错误,因为在前一种情况下对象不可能被释放,{{1在后一种情况下,引用是线程安全的。)
当然,这可能会暴露最新SDK中的错误(因此您应该打开雷达),但更常见的是,您的代码中的错误会导致时间发生变化已经导致表现出来。如上所述,您应该在weak
上设置一个符号断点,以找出有问题的对象。
答案 1 :(得分:0)
这是因为释放了一个对象两次或释放了一个从未分配过的指针或者通过一个先前指向已经释放的对象的无效指针进行写入。
尝试Product > Scheme > Edit Scheme
,然后在Diagnostics
标签下启用所有Malloc
设置和Guard Malloc
。(此选项仅在模拟器中可用)