我在Mac OS X上的基于Cocoa的应用程序中使用垃圾收集器。它运行了100个线程,并使用Operation Queue完成同步。
长时间运行后,其中一个对象被盗,应用程序将崩溃。
检查对象是否为非nil也会失败,因为该对象无效并包含一些垃圾值。在对象上调用方法会导致崩溃。
任何人都可以帮我调试这个问题。
谢谢......................
答案 0 :(得分:2)
我正在使用垃圾收集器 Mac OS X上基于Cocoa的应用程序。 它有100个线程运行和 使用完成同步 操作队列。
更有可能的是,错误在于代码看似过于并发的性质。在具有“仅”两位数内核(如果这样)的机器上运行100个线程不太可能非常有效,当然,保持所有内容正确同步将是相当困难的。
最好的起点是打开Malloc堆栈日志记录并使用malloc_history
找出南方地址发生的事件。
此外,10.6.5中的修复程序影响了GC的正确性。
答案 1 :(得分:0)
如果你可以改变垃圾收集对象的代码,那么覆盖这样的finalize方法,以获得一些信息:
- (void) finalize
{
NSLog(@"Finalizing!\n%@", [[NSThread callStackSymbols] componentsJoinedByString:@"\n"]);
//if you put here a breakpoint, you can check the supposed references to this object
[super finalize];
}