Какао: сбой в _NSDisplayOperationStack; Нужно руководство - PullRequest
2 голосов
/ 22 марта 2012

Проблема

Я получаю отчеты о сбоях от пользователей, которые выглядят так:


Code Type:       X86-64 (Native)
Parent Process:  launchd [223]

Date/Time:       2012-03-22 11:28:33.087 +0800
OS Version:      Mac OS X 10.7.3 (11D50)
Report Version:  9

Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: 0x000000000000000d, 0x0000000000000000

VM Regions Near 0:
--> 
    __TEXT                 000000010c202000-000000010c29c000 [  616K] r-x/rwx SM=COW      /Applications/CodeKit.app/Contents/MacOS/CodeKit

Application Specific Information:
objc_msgSend() selector name: release
objc[22113]: garbage collection is OFF

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libobjc.A.dylib                 0x00007fff904f5390 objc_msgSend_vtable14 + 16
1   com.apple.Foundation            0x00007fff8f664137 empty + 61
2   com.apple.Foundation            0x00007fff8f666c10 dealloc + 24
3   com.apple.Foundation            0x00007fff8f666bd1 -[NSConcreteMapTable dealloc] + 64
4   com.apple.AppKit                0x00007fff892bc52c -[_NSDisplayOperation dealloc] + 84
5   com.apple.CoreFoundation        0x00007fff8fdc7ca0 CFRelease + 176
6   com.apple.CoreFoundation        0x00007fff8fdf0742 -[__NSArrayM removeObjectAtIndex:]     + 434
7   com.apple.AppKit                0x00007fff892bc408 -[_NSDisplayOperationStack     exitDisplayOperationForWindow:] + 417
8   com.apple.AppKit                0x00007fff892be2fc -[NSView _displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:] + 7136
9   com.apple.AppKit                0x00007fff892b6429 -[NSView displayIfNeeded] + 1676
10  [SEE DISCUSSION BELOW]

Обсуждение

Строки 10 и ниже сильно различаются между отчетами (и, следовательно, не связаны с падением). Однако последовательность строк от 1 до 9 всегда одинакова. Каждый сбой содержит эту точную последовательность. Я прогуглил «_NSDisplayOperationStack» и нашел похожие отчеты о сбоях для десятков приложений (включая такие известные, как приложения Omni и Apple's Motion.)


Что мне нужно

Поскольку сбой происходит от Core Foundation, я понятия не имею, с чего начать поиск проблемы. Похоже, что это глубоко в частном механизме рисования какао. Что еще хуже, я не могу воспроизвести сбой на моей машине, поэтому я не могу отследить его с помощью инструментов. Но я получил много отчетов по приведенной выше схеме, поэтому я знаю, что это проблема. Хуже того, пользователи даже не могут надежно воспроизвести аварию - она ​​полностью прерывистая.

Я надеюсь, что приведенная выше последовательность кому-то покажется знакомой, и они могут дать мне указания о том, с чего начать поиск проблемы. Спасибо.

Ответы [ 2 ]

4 голосов
/ 05 апреля 2012

Я разместил этот же вопрос на форумах разработчиков Apple, и один инженер сказал мне, что похоже, что трассировка стека связана с одновременным отображением чертежей, что является функцией, представленной в 10.6.

Я просмотрел все свои файлы NIB и нашел два экземпляра NSButton, которые были настроены для одновременного рисования - это не было преднамеренным;Должно быть, в какой-то момент я случайно установил этот флажок.

Я отключил одновременное рисование для них обоих, и этот сбой волшебным образом исчез.

2 голосов
/ 01 февраля 2013

В некоторых случаях отключение одновременного рисования только для некоторых кнопок не помогает. Я получил ту же ошибку, что и у автора («Недостаток _NSDisplayOperationStack, возникающий при сердцебиении.»). К счастью, в окне есть главный переключатель, который отключает одновременное рисование для одного окна:

[self.window setAllowsConcurrentViewDrawing:NO];

Помогло также открытие окна через блок, выполненный в главной очереди:

dispatch_async(dispatch_get_main_queue(), ^{
    if(nil == self.someWindowController) {
        self.someWindowController = [[[SomeWindowController alloc] initWithWindowNibName:@"SomeWindowController"] autorelease];
    }
    [self.someWindowController.window makeKeyAndOrderFront:self];
});

Отображение окна изнутри блока просто немного откладывает выполнение, но для моего приложения, некоторые дополнительные окна открываются с помощью ярлыка меню, комбинация из них была only вещь работает.

...