运行OS X应用程序几天后,EXC_BAD_INSTRUCTION(SIGILL)崩溃

时间:2014-02-17 21:28:27

标签: objective-c macos cocoa crash crash-reports

我的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从睡眠状态唤醒后崩溃。

这种方法可以泄漏吗?从长远来看会导致自动释放问题吗?

1 个答案:

答案 0 :(得分:3)

问题是运行时发现自动释放池数据结构已损坏。

这可能是某处的内存错误。它不一定是堆栈跟踪中代码中的错误,尽管它可能是附近代码中的错误,或者代码中的错误同时在其他线程上运行。

在你的情况下magic是正确的(它应该是0xa1a1a1a1“AUTORELEASE!”),这意味着pthread是错误的。内存错误会损坏该值,或者错误的线程上以某种方式使用自动释放池。