2011-05-01 65 views
1

我的应用程序的很多用户都在这次崩溃中发送,但我无法重复它..所以我正在寻找关于如何排除故障的提示,这里是相关部分崩溃日志:帮我诊断这次崩溃

Exception Type: EXC_BAD_INSTRUCTION (SIGILL) 
Exception Codes: 0x0000000000000001, 0x0000000000000000 
Crashed Thread: 0 Dispatch queue: com.apple.main-thread 

Application Specific Information: 
objc[1535]: FREED(id): message retain sent to freed object=0x640ad0 

Thread 0 Crashed: Dispatch queue: com.apple.main-thread 
0 libobjc.A.dylib      0x9116f4b4 _objc_error + 116 
1 libobjc.A.dylib      0x9116f4ea __objc_error + 52 
2 libobjc.A.dylib      0x9116d7dc _freedHandler + 58 
3 ...my_company.my_app  0x00045635 -[MyObject mySelector] + 1494 
4 com.apple.Foundation    0x90be18d4 __NSFireTimer + 141 
5 com.apple.CoreFoundation   0x93a38adb __CFRunLoopRun + 8059 
6 com.apple.CoreFoundation   0x93a36464 CFRunLoopRunSpecific + 452 
7 com.apple.CoreFoundation   0x93a36291 CFRunLoopRunInMode + 97 
8 com.apple.HIToolbox     0x92982e04 RunCurrentEventLoopInMode + 392 
9 com.apple.HIToolbox     0x92982bb9 ReceiveNextEventCommon + 354 
10 com.apple.HIToolbox     0x92982a3e BlockUntilNextEventMatchingListInMode  + 81 
11 com.apple.AppKit     0x9576e78d _DPSNextEvent + 847 
12 com.apple.AppKit     0x9576dfce -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 156 
13 com.apple.AppKit     0x95730247 -[NSApplication run] + 821 
14 com.apple.AppKit     0x957282d9 NSApplicationMain + 574 
15 ...my_company.my_app  0x00002042 start + 54 

所以,从这个行:

3 ...my_company.my_app  0x00045635 -[MyObject mySelector] + 1494 

我可以推断,在mySelector消息被发送到一个已经被释放的对象,但我已经通过代码看而我只是无法看到它,并且有太多的其他依赖关系来发布代码。

所以我的问题是:

  1. 在每行的到底是什么做的数字表明,在上面的例子是1494
  2. 在前面的行有到__NSFireTimer参考 - 这确实表明mySelector是否被我的代码中的NSTimer调用?
  3. 我试过运行我的应用程序启用僵尸,除了洒我的代码检查每个对象!=无在mySelector中,如果我不能重复崩溃,我还能做什么?

任何帮助,将不胜感激!

+0

如果可以,请发送您的代码,以便我可以解决崩溃问题。 – 2011-05-01 06:48:46

回答

0

使用仪器观看分配。我发现它很有帮助。

0

我相信每行末尾的数字表示回溯中该点处函数内代码字节的偏移量。调试器会使用此信息将代码偏移映射到实际的源代码行(它需要应用程序中的调试信息才能执行此操作)。就你而言,这些信息并不特别有用。

对NSFireTimer的引用意味着你的主线程的运行循环已经安排了一个计时器并且它触发了调用[myObject mySelector]。我认为从堆栈跟踪中我们可以假定计时器直接调用了“myObject”,因为没有其他介入堆栈帧。

我的猜测是该对象已被释放,但它是您的主线程中计划的计时器的目标,它已被忘记删除。

对象首先被释放的方式取决于应用程序的编译方式。它使用垃圾收集还是依赖保留/释放内存管理?

如果你不使用垃圾收集,那么你可能错过了某处的“保留”。也许你的对象已经被自动释放,并且runloop已经清除了它,当你不期望它?

如果您可以识别涉及的定时器,则可能需要考虑在类的dealloc或finalize方法中禁用定时器。您也可以在那里添加一些日志记录,以显示对象何时被释放。