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行为的开关。