解释崩溃日志目标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
尝试访问某些数据块(可能是对象的值或物品或东西吗?)已被释放,但将实现代码如下仍引用。
有几个方法来解决这个问题:
- 运行您的代码静态分析。这将发现任何明显的泄漏
- 使用仪器运行您的代码,特别是打开僵尸工具。这将跟踪您何时尝试将消息发送到已被释放的对象。它还将包括吨的有用信息,如创建对象,何时何地被保留,释放和自动释放,最后它被释放的时间和地点。
答
格雷格帕克冷杉的Objective-C运行的工程师。他关于解释objc_msgSend崩溃的博客文章基本上是权威资源:http://www.sealiesoftware.com/blog/archive/2008/09/22/objc_explain_So_you_crashed_in_objc_msgSend.html。
简答:你有一个内存损坏的错误。
这里的问题:它只有崩溃某些机器上,并排除地雷。 '和它检测到该阵列是nil,它之前将它传递给tableview中创建它:提供动力的的tableview阵列,当所述的tableview调用'objectValueForTableColumn的方式受到保护。除了'dealloc',我不会在任何地方释放它们。 – Pripyat 2011-03-19 08:50:33
我怀疑这是过度发布的对象价值 - 更可能是数据源本身。 – 2012-11-11 02:46:33