我的OS X应用程序在使用几天后随机崩溃,并提供有关autorelease损坏的精确日志,但我无法理解原因:
Crashed Thread: 4
Exception Type: EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes: 0x0000000000000001, 0x0000000000000000
Application Specific Information:
objc[35716]: autorelease pool page 0x1009d2000 corrupted
magic 0xa1a1a1a1 0x4f545541 0x454c4552 0x21455341
pthread 0x107b92000
并在帖子中:
Thread 4 Crashed:
0 libobjc.A.dylib 0x00007fff9461575b _objc_trap() + 0
1 libobjc.A.dylib 0x00007fff9461589b _objc_fatal + 195
2 libobjc.A.dylib 0x00007fff946255d2 (anonymous namespace)::AutoreleasePoolPage::check(bool) + 134
3 libobjc.A.dylib 0x00007fff9461153c (anonymous namespace)::AutoreleasePoolPage::autoreleaseSlow(objc_object*) + 252
4 libobjc.A.dylib 0x00007fff94624781 _objc_rootAutorelease2(objc_object*) + 75
5 com.mybiz.myapp 0x0000000100001f86 -[IpAddress to_dotted_char:] + 27 (IpAddress.m:130)
关注的方法如下,在inet_ntop上的第130行
- (void) to_dotted_char: (char*)buf {
inet_ntop(AF_INET, (struct in_addr*)[self.networkOrder bytes], buf, INET_ADDRSTRLEN);
}
- (NSString*) to_dotted_string {
char buf[INET_ADDRSTRLEN];
[self to_dotted_char:buf];
NSString* dotted_string = [NSString stringWithUTF8String:buf];
return dotted_string;
}
我每分钟使用这种方法20-30次,几天后崩溃,有时在将Mac从睡眠状态唤醒后崩溃。
这种方法可以泄漏吗?从长远来看会导致自动释放问题吗?
答案 0 :(得分:3)
问题是运行时发现自动释放池数据结构已损坏。
这可能是某处的内存错误。它不一定是堆栈跟踪中代码中的错误,尽管它可能是附近代码中的错误,或者代码中的错误同时在其他线程上运行。
在你的情况下magic
是正确的(它应该是0xa1a1a1a1“AUTORELEASE!”),这意味着pthread
是错误的。内存错误会损坏该值,或者错误的线程上以某种方式使用自动释放池。