【问题标题】:Interpreting a Crash Log Objective C解释崩溃日志目标 C
【发布时间】:2011-03-19 08:16:53
【问题描述】:

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

我怎样才能找到这个问题的原因?我尝试使用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

【问题讨论】:

    标签: objective-c cocoa crash-reports


    【解决方案1】:

    Greg Parker 是 Objective-C 运行时的工程师。他关于解释 objc_msgSend 中的崩溃的博文本质上是权威来源:http://www.sealiesoftware.com/blog/archive/2008/09/22/objc_explain_So_you_crashed_in_objc_msgSend.html

    简短的回答:您有一个内存损坏错误。

    【讨论】:

      【解决方案2】:

      这是内存管理错误的典型症状。 NSTableView 正在尝试访问已被释放但 tableview 仍然引用的某些数据(可能是对象值或项目或其他东西?)。

      有几种方法可以解决这个问题:

      • 对您的代码运行静态分析器。这将发现任何明显的泄漏
      • 使用 Instruments 运行您的代码,特别是在打开 Zombies 工具的情况下。这将跟踪您何时尝试向已被释放的对象发送消息。它还将包含 大量 有用信息,例如创建对象的时间和地点、保留、释放和自动释放的时间和地点,以及最终释放对象的位置。

      【讨论】:

      • 问题是:它只在某些机器上崩溃,不包括我的机器。为 tableview 提供动力的数组受到保护,当 tableview 调用 objectValueForTableColumn: 并检测到数组为 nil 时,它会在将其传递给 tableview 之前创建它。除了dealloc,我不会在任何地方发布它们。
      • 我怀疑是过度释放的对象值——更可能是数据源本身。
      猜你喜欢
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      相关资源
      最近更新 更多