NSTask 在 OSX High Sierra 上因 EXC_SOFTWARE 异常而崩溃

NSTask crashing with EXC_SOFTWARE exception on OSX High Sierra

我有一个 mac OSX 应用程序,它曾经使用 system() 来 运行 一些 ImageMagick 命令 - 但突然间这些调用开始崩溃并出现

EXC_SOFTWARE (code=131072,subcode 0x0)

我能想到的最近发生变化的唯一一件事是我升级到 High Sierra,然后 Xcode 将自身更新到 10.0 - 所以也许其中之一可能与它有关。

例如,如果我尝试:

system("ls -l");

NSTask *task = [[NSTask alloc] init];
task.executableURL = [NSURL fileURLWithPath:@"/bin/bash"];
[task setArguments:@[ @"-c", @"ls -l"]];
NSError *error=nil;
[task launchAndReturnError:&error];
[task waitUntilExit];

然后在这两种情况下我都会遇到此崩溃。在这两种情况下,我都可以在崩溃发生之前看到一些目录列表输出出现在日志中。

当不尝试 运行 bash 时也会发生崩溃 - 如果我直接从 NSTask 尝试 运行 /bin/ls 我会遇到同样的崩溃。

这些命令通常在后台 GCD 队列上 运行 - 但我也在主队列上尝试过它们,但它们仍然崩溃。

当我 运行 我的 ImageMagick 代码使用 NSTask 时,命令完成并输出它应该输出的图像,但随后我遇到同样的崩溃(顺便说一句,这就是为什么我 运行通过 bash 命令,因为 IM 启动 ghostscript 并需要设置路径才能正常工作)。

所以看起来这些命令正在完成,然后在命令完成后发生其他事情导致崩溃。

这里是控制台回溯(包括 ls -l 命令的部分输出)当 运行在 main ViewController:

total 8
drwxr-xr-x  3 simon  staff    96 Sep 26 15:44 Database.app
-rw-r--r--  1 simon  staff  2219 Sep 27 13:23 00000001_01.png
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_SOFTWARE (code=131072, subcode=0x0)
  * frame #0: 0x00007fff6598193e libsystem_kernel.dylib`__posix_spawn + 10
    frame #1: 0x00007fff6597ae67 libsystem_kernel.dylib`posix_spawn + 483
    frame #2: 0x00007fff3fc42230 Foundation`-[NSConcreteTask launchWithDictionary:error:] + 3510
    frame #3: 0x000000010000f430 FanfugaDatabase`-[ViewController viewDidLoad](self=0x00006040000e2200, _cmd="viewDidLoad") at ViewController.m:45
    frame #4: 0x00007fff3af1c20a AppKit`-[NSViewController _sendViewDidLoad] + 97
    frame #5: 0x00007fff3b4c0afd AppKit`_noteLoadCompletionForObject + 641
    frame #6: 0x00007fff3aea097d AppKit`-[NSIBObjectData nibInstantiateWithOwner:options:topLevelObjects:] + 2042
    frame #7: 0x00007fff3af9bd1e AppKit`-[NSNib _instantiateNibWithExternalNameTable:options:] + 679
    frame #8: 0x00007fff3af9b97a AppKit`-[NSNib _instantiateWithOwner:options:topLevelObjects:] + 136
    frame #9: 0x00007fff3af9ac50 AppKit`-[NSViewController loadView] + 343
    frame #10: 0x00007fff3af12a9e AppKit`-[NSViewController _loadViewIfRequired] + 75
    frame #11: 0x00007fff3af12a09 AppKit`-[NSViewController view] + 30
    frame #12: 0x00007fff3b091365 AppKit`-[NSWindow _contentViewControllerChanged] + 109
    frame #13: 0x00007fff3fa7de8e Foundation`-[NSObject(NSKeyValueCoding) setValue:forKey:] + 331
    frame #14: 0x00007fff3b0d40c5 AppKit`-[NSWindow setValue:forKey:] + 111
    frame #15: 0x00007fff3b0d4029 AppKit`-[NSIBUserDefinedRuntimeAttributesConnector establishConnection] + 637
    frame #16: 0x00007fff3aea0719 AppKit`-[NSIBObjectData nibInstantiateWithOwner:options:topLevelObjects:] + 1430
    frame #17: 0x00007fff3af9bd1e AppKit`-[NSNib _instantiateNibWithExternalNameTable:options:] + 679
    frame #18: 0x00007fff3af9b97a AppKit`-[NSNib _instantiateWithOwner:options:topLevelObjects:] + 136
    frame #19: 0x00007fff3b6f246c AppKit`-[NSStoryboard instantiateControllerWithIdentifier:] + 236
    frame #20: 0x00007fff3ae94a27 AppKit`NSApplicationMain + 729
    frame #21: 0x0000000100012262 Database`main(argc=3, argv=0x00007ffeefbff4f8) at main.m:12
    frame #22: 0x00007fff65831015 libdyld.dylib`start + 1
    frame #23: 0x00007fff65831015 libdyld.dylib`start + 1
(lldb) 

根据要求,我尝试创建一个简单的命令行应用程序:

int main(int argc, const char * argv[]) {
    printf("Hello, World!\n");
    system("ls -l");
    return 0;
}

并且由于相同的异常而崩溃:

Hello, World!
total 56
-rwxr-xr-x  1 simon  staff  27680 Oct  1 21:34 test
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_SOFTWARE (code=131072, subcode=0x0)
  * frame #0: 0x00007fff6598193e libsystem_kernel.dylib`__posix_spawn + 10
    frame #1: 0x00007fff6597ae67 libsystem_kernel.dylib`posix_spawn + 483
    frame #2: 0x00007fff658fc9b1 libsystem_c.dylib`system + 407
    frame #3: 0x0000000100000f56 test`main(argc=1, argv=0x00007ffeefbff5e0) at main.c:14
    frame #4: 0x00007fff65831015 libdyld.dylib`start + 1
(lldb) 

更新

如果我 运行 Cocoa 应用程序或命令行直接从 finder 测试可执行文件,它们工作正常。因此,这与导致此问题的 xCode(大概是 xCode 10.0)启动的应用程序有关。

这对我来说似乎是一个 xCode 10 错误。向 Apple 报告,这是他们的回复:

We’re not familiar with the EXC_SOFTWARE signal, but searching online it appears to be involved with some anti-virus software. Do you have any installed on your Mac? You would likely need to ask the makers of that software if this is expected and if there are any workarounds. If it is possible to try disabling it to see if it reproduces, that may be instructive.

我的 mac 上确实安装了 BitDefender 运行 - 删除了它,嘿,很快这个错误就消失了。所以这是一个 BitDefender 错误。会报告给他们的。