Rust 1.4.0(或更高版本)carge/rustc在Xcode中使用NSTask在AppKit应用程序中运行时崩溃



Rust 1.4.0安装的multirust在命令行上运行良好,但如果由Apple AppKit中的NSTask执行,则会因信号11而崩溃。

我写了一些测试用例来重现它们。当前状态为;

  • 带有NSTask的命令行程序。这很好用
  • 带有NSTask的AppKit应用程序。这总是崩溃
  • AppKit应用程序仅链接到AppKit。应用程序中没有实际的AppKit代码。也会崩溃
  • AppKit应用程序是用Objective-C编写的。也会崩溃
  • 使用BSD级别pty而不是NSTask运行货物的AppKit应用程序。工作良好

这个问题同样发生在使用Homebrew从源代码构建的Rust安装中。Rust 1.2.0货物和rustc不会出现此问题。他们工作得很好。如果应用程序的Xcode调试器用完,则不会发生这种情况。所以主要原因似乎是Xcode调试上下文。似乎是设置了一些错误。。。使用命令行LLDB运行应用程序不会导致此问题。啊。。。

我使用的是Xcode 7.1.1。

测试代码可以从这里下载:https://github.com/eonil/Rust140InAppKitCrashTestCases

TL;DR

在启动NSTask之前,请执行以下操作。

    var envs = NSProcessInfo.processInfo().environment;
    envs["DYLD_LIBRARY_PATH"] = nil
    // print(NSProcessInfo.processInfo().environment["DYLD_LIBRARY_PATH"])
    _remoteTask = NSTask()
    _remoteTask.environment = envs

解释

有时Xcode会将DYLD_LIBRARY_PATH环境变量重写为非系统目录(类似于"/Users/Eonil/Workshop/Temp/Xcode/Derivations/EditorOnly-hfhkxuguvplpqvdcinldyuivhucp/Build/Products/Debug:/usr/lib/system/introspection"

该环境变量按原样继承到NSTask实例,因为.environment未设置为nil

最干净的解决方案是仔细设置所有需要的环境变量。

我找不到关闭这种Xcode行为的开关。

最新更新