更新到macOS Mojave后,[NSWindow orderFrontRegardless]崩溃

时间:2019-02-18 20:24:02

标签: objective-c macos cocoa crash macos-mojave

在更新到Mojave后得到此奇怪的崩溃。

没有做任何特别的事情,只需创建一个NSWindow并调用orderFrontRegardless

以前总是很好。

1   libsystem_platform.dylib            0x00007fff6610ab5d _sigtramp + 29
2   ???                                 0x0000000000000000 0x0 + 0
3   CoreFoundation                      0x00007fff39b00bb6 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12
4   CoreFoundation                      0x00007fff39b00b30 ___CFXRegistrationPost_block_invoke + 63
5   CoreFoundation                      0x00007fff39b00a9a _CFXRegistrationPost + 404
6   CoreFoundation                      0x00007fff39b08f48 ___CFXNotificationPost_block_invoke + 87
7   CoreFoundation                      0x00007fff39a71994 -[_CFXNotificationRegistrar find:object:observer:enumerator:] + 1642
8   CoreFoundation                      0x00007fff39a70d47 _CFXNotificationPost + 732
9   Foundation                          0x00007fff3bdab217 -[NSNotificationCenter postNotificationName:object:userInfo:] + 66
10  AppKit                              0x00007fff3720538b -[NSWindow _setFrameCommon:display:stashSize:] + 3090
11  AppKit                              0x00007fff37204766 -[NSWindow _setFrame:display:allowImplicitAnimation:stashSize:] + 192
12  AppKit                              0x00007fff3720469f -[NSWindow setFrame:display:] + 51
13  AppKit                              0x00007fff3727aca9 -[NSWindow _reallyDoOrderWindowAboveOrBelow:relativeTo:findKey:forCounter:force:isModal:] + 1336
14  AppKit                              0x00007fff372792a0 -[NSWindow _doOrderWindow:relativeTo:findKey:forCounter:force:isModal:] + 283
15  AppKit                              0x00007fff37a0dce9 -[NSWindow orderFrontRegardless] + 40

代码(这是一个控制台应用程序):

NSWindow *window =    [[NSWindow alloc] initWithContentRect:windowRect
styleMask:windowStyle
backing:NSBackingStoreBuffered
defer:NO];

// Since Snow Leopard, programs without application bundles and Info.plist
// files don't get a menubar and can't be brought to the front unless the
// presentation option is changed
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];

 [NSApp activateIgnoringOtherApps:YES];
 [window makeKeyAndOrderFront:nil];

3 个答案:

答案 0 :(得分:4)

如何初始化应用程序?在使用NSApplication之前,您是否已初始化AppKit

在main.m中应该需要执行以下步骤:

@autoreleasepool {
    NSApplication* application = NSApplication.sharedApplication;

    AppDelegate* delegate = [[AppDelegate alloc] init];
    application.delegate = delegate;

    [application run];
}

另外,由于NSApp对它的引用很少,因此您的委托人可能会被释放。

答案 1 :(得分:1)

您表示您正在取消引用未初始化的指针。但是,从您发布的报告中我没有足够的信息来知道这是(也许是幸运的)空值,还是仅仅是垃圾内存。我假设在某个时候您因EXC_BAD_ACCESS而崩溃(信号等效项为SIGBUSSIGSEGV,视情况而定。)

这里的关键信息是您已安装了信号处理程序。

信号处理程序通常(但并非总是)在崩溃线程上使用同一堆栈运行。内核使用该_sigtramp函数注入处理程序。发出信号后,当前堆栈状态包含您需要的信息以跟踪不良的内存访问。但是,您的信号处理程序却被调用了。这样就可以运行了,就像对堆栈进行了更改一样。

然后,您的信号处理程序以某种方式完成。可以使用sigaction配置信号处理程序,以便将过程状态恢复到崩溃事件之前的那一刻。我不确定您的信号处理程序是如何配置的。但是,最终,我将假定允许该过程退出。

这时,Apple的ReportCrash已被触发,并且将捕获所有线程的回溯,无论信号处理程序处于何种状态。这很关键,因为这不一定是崩溃状态。

增加复杂性,backtrace_symbols_fd在信号处理程序中使用根本不安全。异步安全性极富挑战性,并且很难正确地从信号处理程序中运行代码高度。您可以安全地完成很少的事情。另外,我非常确定backtrace_symbols_fd会分配内存。因此,如果您的崩溃发生在某个地方的内存分配器中,而且听起来确实如此,那么您肯定有陷入死锁的危险。从回溯的角度来看,这似乎就是发生的事情。请查看man sigaction,了解一些详细信息。

更糟糕的是,由于内核确实可以运行您的处理程序,因此在信号处理程序框架上展开堆栈特别具有挑战性。这就是为什么???帧在那里的原因。

摘要:

如果未安装信号处理程序,Apple的ReportCrash将为崩溃的线程产生正确的(可能有用的)回溯。

您包含的堆栈跟踪信息并不理想,但是很难确切知道原因。 看来backtrace_symbols_fd的展开效果不佳,可能是因为它不适合从信号处理程序中使用,可能是因为在这种情况下它没有足够好的堆栈展开机制作为后盾。但是,没有更多信息,我很难知道。不过,令我感到惊讶的是,最上面的框架是_sigtramp。那没有什么意义。这让我认为信号处理程序本身可能出现了问题。 有可能第二次在您的处理程序中崩溃。

Apple的回溯记录(例如,由ReportCrash,backtrace_symbols_fd或NSThread的callStackReturnAddresses生成)绝对可以信任,只要您谨慎在安全的环境中使用它们即可。

答案 2 :(得分:0)

结果是我在一个完全不同的地方遇到了一个严重的内存错误,甚至在回溯中也没有提到。

我正在取消引用未初始化的指针。

这是第二次发生。

在调试内存错误时不要相信Apple的回溯记录。

即使使用libgmalloc。