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

问题描述 投票:5回答:3

更新到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];
objective-c macos cocoa crash macos-mojave
3个回答
1
投票

您表示您正在取消引用未初始化的指针。但是,我没有从您发布的报告中获得足够的信息,以了解这是否(可能是运气)null,或者只是垃圾内存。我会假设你在某个时刻撞到了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生成)绝对可以信任,只要您在安全的环境中小心使用它们。


4
投票

你如何初始化应用程序?在使用NSApplication之前,你有AppKit初始化吗?

在main.m中应该有类似这些步骤的东西:

@autoreleasepool {
    NSApplication* application = NSApplication.sharedApplication;

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

    [application run];
}

你的代表也可能被取消分配,因为NSApp对它有一个弱引用。


0
投票

原来我在一个完全不同的地方有一个严重的记忆错误,甚至在回溯中都没有提到。

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

这是它第二次发生。

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

即使使用libgmalloc。

© www.soinside.com 2019 - 2024. All rights reserved.