解释崩溃日志目标C

问题描述:

我想解释下面的这个崩溃日志,但我不确定是否正确理解它。 objc_msgSend()表示我正在发送消息给已经处理的东西。所以基本上数据源在tableview可以绘制其单元格之前消失?解释崩溃日志目标C

我怎样才能找到这个问题的原因?我试过使用atos工具来查找它返回的十六进制的崩溃位置,但无济于事。

Exception Type: EXC_BAD_ACCESS (SIGBUS) 
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000020 
Crashed Thread: 0 Dispatch queue: com.apple.main-thread 

Application Specific Information: 
objc_msgSend() selector name: tableView:objectValueForTableColumn:row: 


Thread 0 Crashed: Dispatch queue: com.apple.main-thread 
0 libobjc.A.dylib     0x93f89ed7 objc_msgSend + 23 
1 com.apple.AppKit    0x936143ea -[NSTableView preparedCellAtColumn:row:] + 335 
2 com.apple.AppKit    0x9362e8bc -[NSTableView _drawContentsAtRow:column:withCellFrame:] + 56 
3 com.apple.AppKit    0x9362d92a -[NSTableView drawRow:clipRect:] + 1131 
4 com.apple.AppKit    0x9362d362 -[NSTableView drawRowIndexes:clipRect:] + 360 
5 com.apple.AppKit    0x9362bd3b -[NSTableView drawRect:] + 1144 
6 com.apple.AppKit    0x936218fd -[NSView _drawRect:clip:] + 3721 
7 com.apple.AppKit    0x9361efc9 -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 2217 
8 com.apple.AppKit    0x9361f95c -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 4668 
9 com.apple.AppKit    0x9361f95c -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 4668 
10 com.apple.AppKit    0x9361f95c -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 4668 
11 com.apple.AppKit    0x9361f95c -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 4668 
12 com.apple.AppKit    0x9361e55b -[NSThemeFrame _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 265 
13 com.apple.AppKit    0x9361aea2 -[NSView _displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:] + 3309 
14 com.apple.AppKit    0x9357ba57 -[NSView displayIfNeeded] + 818 
15 com.apple.AppKit    0x93544d40 -[NSWindow displayIfNeeded] + 204 
16 com.apple.AppKit    0x9357628a _handleWindowNeedsDisplay + 696 
17 com.apple.CoreFoundation  0x94f0ae02 __CFRunLoopDoObservers + 1186 
18 com.apple.CoreFoundation  0x94ec6d8d __CFRunLoopRun + 557 
19 com.apple.CoreFoundation  0x94ec6464 CFRunLoopRunSpecific + 452 
20 com.apple.CoreFoundation  0x94ec6291 CFRunLoopRunInMode + 97 
21 com.apple.HIToolbox    0x94188004 RunCurrentEventLoopInMode + 392 
22 com.apple.HIToolbox    0x94187cf7 ReceiveNextEventCommon + 158 
23 com.apple.HIToolbox    0x94187c40 BlockUntilNextEventMatchingListInMode + 81 
24 com.apple.AppKit    0x9354c78d _DPSNextEvent + 847 
25 com.apple.AppKit    0x9354bfce -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 156 
26 com.apple.AppKit    0x9350e247 -[NSApplication run] + 821 
27 com.apple.AppKit    0x935062d9 NSApplicationMain + 574 
28 ...yapp.com 0x00003032 0x1000 + 8242 

这是内存管理错误的典型症状。 NSTableView尝试访问某些数据块(可能是对象的值或物品或东西吗?)已被释放,但将实现代码如下仍引用。

有几个方法来解决这个问题:

  • 运行您的代码静态分析。这将发现任何明显的泄漏
  • 使用仪器运行您的代码,特别是打开僵尸工具。这将跟踪您何时尝试将消息发送到已被释放的对象。它还将包括吨的有用信息,如创建对象,何时何地被保留,释放和自动释放,最后它被释放的时间和地点
+0

这里的问题:它只有崩溃某些机器上,并排除地雷。 '和它检测到该阵列是nil,它之前将它传递给tableview中创建它:提供动力的的tableview阵列,当所述的tableview调用'objectValueForTableColumn的方式受到保护。除了'dealloc',我不会在任何地方释放它们。 – Pripyat 2011-03-19 08:50:33

+0

我怀疑这是过度发布的对象价值 - 更可能是数据源本身。 – 2012-11-11 02:46:33

格雷格帕克冷杉的Objective-C运行的工程师。他关于解释objc_msgSend崩溃的博客文章基本上是权威资源:http://www.sealiesoftware.com/blog/archive/2008/09/22/objc_explain_So_you_crashed_in_objc_msgSend.html

简答:你有一个内存损坏的错误。