【问题标题】:Cocoa: Crash in _NSDisplayOperationStack; Need GuidanceCocoa:_NSDisplayOperationStack 崩溃;需要指导
【发布时间】:2012-04-06 18:52:25
【问题描述】:

问题

我收到来自用户的崩溃报告,如下所示:


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 行的顺序总是相同。每个崩溃都包含这个确切的序列。我在 Google 上搜索了“_NSDisplayOperationStack”,发现了几十个应用程序(包括知名应用程序,如 Omni 应用程序和 Apple 的 Motion)的类似崩溃报告。


我需要什么

因为崩溃来自 Core Foundation,我不知道从哪里开始寻找问题。它似乎深藏在 Cocoa 的私人视图绘图机器中。更糟糕的是,我根本无法在我的机器上复制崩溃,所以我无法使用 Instruments 跟踪它。但是我收到了很多关于上述模式的报告,所以我知道这是一个问题。更糟糕的是,用户甚至无法可靠地重现崩溃——它完全是间歇性的。

我希望上面的顺序对某些人来说很熟悉,他们可以指导我从哪里开始寻找问题。谢谢。

【问题讨论】:

    标签: objective-c macos cocoa crash nsview


    【解决方案1】:

    我在 Apple 开发者论坛上发布了同样的问题,一位工程师告诉我,看起来堆栈跟踪与并发视图绘制有关,这是 10.6 中引入的一项功能。

    我浏览了所有的 NIB 文件,发现两个 NSButton 实例被设置为同时绘制 --- 这不是故意的;我一定是在某个时候不小心选中了那个框。

    我禁用了他们两个的并发绘图,这个崩溃神奇地消失了。

    【讨论】:

    • 祝福你!多年来,我一直试图追查这次崩溃,果然,我有几个按钮有这个设置。我取消选中它们,不再崩溃!
    【解决方案2】:

    在某些情况下,仅对某些按钮禁用并发绘制并没有帮助。我得到了与作者相同的错误(“心跳期间引发_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];
    });
    

    在一个块中显示窗口只是稍微推迟了执行,但对于我的应用程序,通过菜单快捷方式打开了一些额外的窗口,两者的结合是唯一起作用的东西。 p>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      相关资源
      最近更新 更多