Интерпретация Цели журнала сбоя Цель C - PullRequest
0 голосов
/ 19 марта 2011

Я пытаюсь интерпретировать этот аварийный журнал ниже, но я не уверен, правильно ли я его понимаю. objc_msgSend() означает, что я отправляю сообщение тому, что уже освобождено. Таким образом, в основном источник данных исчезает до того, как табличное представление сможет нарисовать свои ячейки?

Как я могу найти причину этой проблемы? Я пытался использовать инструмент 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

Ответы [ 2 ]

3 голосов
/ 20 марта 2011

Грег Паркер - инженер, работающий в Objective-C.Его сообщение в блоге об интерпретации сбоев в objc_msgSend по сути является окончательным источником: http://www.sealiesoftware.com/blog/archive/2008/09/22/objc_explain_So_you_crashed_in_objc_msgSend.html.

Краткий ответ: у вас есть ошибка, приводящая к повреждению памяти.

2 голосов
/ 19 марта 2011

Это классический признак ошибки управления памятью.NSTableView пытается получить доступ к некоторому фрагменту данных (возможно, значению объекта или элементу или чему-то?), Который был освобожден, но на который все еще ссылается табличное представление.

Существует несколько способов решить эту проблему:

  • Запустите статический анализатор для вашего кода.Это обнаружит любые очевидные утечки
  • Запустите ваш код с помощью Инструментов, особенно с включенным инструментом Зомби.Это будет отслеживать, когда вы попытаетесь отправить сообщение объекту, который уже был освобожден.Он также будет включать тонн полезной информации, например, когда и где объект был создан, когда и где он был сохранен, выпущен и автоматически освобожден, и, наконец, где он был освобожден.
...