“GPU 进程不可用。再见。”

我正在尝试使用 Electron 构建 Windows 和 Mac OS 应用程序,但遇到了障碍。

简而言之,如果我尝试在 Mac OS Big Sur 上直接使用 Electron 运行应用程序(而不是构建一个 Mac 应用程序然后运行它),我会返回以下错误:

[35941:0821/171720.038162:FATAL:gpu_data_manager_impl_private.cc(415)] GPU process isn't usable. Goodbye.

我在 package.json 中使用以下内容直接使用 Electron 运行:

"scripts": {
  ...
  "test": "electron main.js",
  ...
}

到目前为止,我唯一可以访问的 Mac OS 环境是 Big Sur,所以还没有在早期版本的 Mac OS 上尝试过这个,但是从谷歌搜索看来,这个错误可能与 Big Sur 收紧的安全/沙盒限制有关——但我猜关于那个。

无论如何,经过一些谷歌搜索后,一些建议表明尝试在没有应用程序沙箱的情况下运行,即将其添加到 main.js

app.commandLine.appendSwitch('no-sandbox');

这一切都很好,很好并且有效。

但是,如果我想要构建和分发针对 Mac App Store 的签名 Mac 应用程序,或者只是一个签名的沙盒 DMG 或 PKG 安装程序,那么这将不合适。

如果我从 no-sandbox 中删除上述 main.js 命令并在我的权利 plist 中指定应用程序沙箱,如下所示,生成的已签名应用程序将不会运行:

<key>com.apple.security.app-sandbox</key>
<true/>

该应用程序尝试打开并关闭。我可以尝试使用 open <appname>.app 在命令行运行,但这会在控制台中引发以下错误:

The application cannot be opened for an unexpected reason, error=Error Domain=NSOSStatusErrorDomain Code=-10826 "kLSNoLaunchPermissionErr: User doesn't have permission to launch the app (managed networks)" UserInfo={_LSFunction=_LSLaunchWithRunningboard, _LSLine=2561, NSUnderlyingError=0x7fd3c9c13db0 {Error Domain=RBSRequestErrorDomain Code=5 "Launch failed." UserInfo={NSLocalizedFailureReason=Launch failed., NSUnderlyingError=0x7fd3c9c158e0 {Error Domain=NSPOSIXErrorDomain Code=153 "Unknown error: 153" UserInfo={NSLocalizedDescription=Launchd job spawn failed with error: 153}}}}}

如果我在启用 no-sandbox 的情况下构建一个签名的应用程序,该应用程序将使用 open <appname>.app 在 Big Sur 上运行良好。

我已经通过 Google、Stack Overflow 等尽我所能来诊断这个问题,但没有得到任何结果。希望 Stack Overflow 社区能够为我提供解决此问题的关键线索。

为了进一步了解,我创建了一个新的、空的 Electron 应用程序并按照 Electron Quick Start Guide 到它描述创建一个空的 main.js 的部分,这在技术上应该允许 Electron 应用程序启动 - 但它不会。即使没有实例化 BrowserWindow 或编写我自己的任何自定义代码,GPU 也会抛出上述相同的错误。

新更新:我将这些环境变量设置为 true,然后尝试使用 npm start 运行应用程序:

  • ELECTRON_ENABLE_LOGGING
  • ELECTRON_DEBUG_NOTIFICATIONS
  • ELECTRON_ENABLE_STACK_DUMPING

结果是更详细的错误输出:

[48836:0823/165857.676747:ERROR:icu_util.cc(179)] icudtl.dat not found in bundle
[48836:0823/165857.676838:ERROR:icu_util.cc(243)] Invalid file descriptor to ICU data received.
[48778:0823/165857.677376:ERROR:gpu_process_host.cc(1003)] GPU process exited unexpectedly: exit_code=5
[48778:0823/165857.677430:WARNING:gpu_process_host.cc(1317)] The GPU process has crashed 1 time(s)
[48850:0823/165857.827224:ERROR:icu_util.cc(179)] icudtl.dat not found in bundle
[48848:0823/165857.827255:ERROR:icu_util.cc(179)] icudtl.dat not found in bundle
[48850:0823/165857.827341:ERROR:icu_util.cc(243)] Invalid file descriptor to ICU data received.
[48848:0823/165857.827358:ERROR:icu_util.cc(243)] Invalid file descriptor to ICU data received.
[48778:0823/165857.827836:ERROR:gpu_process_host.cc(1003)] GPU process exited unexpectedly: exit_code=5
[48778:0823/165857.827875:WARNING:gpu_process_host.cc(1317)] The GPU process has crashed 2 time(s)
... repeats until the GPU processes crashes 9 times ...
[48778:0823/165903.080134:FATAL:gpu_data_manager_impl_private.cc(415)] GPU process isn't usable. Goodbye.

还没有时间研究 ICU 指的是什么,但我想我会用这个信息更新。

另一个更新:所有这些都是在我的主要开发机器 Mac OS Big Sur 上完成的。在 Windows 10 机器上尝试,使用相同的 Electron 代码、依赖项等,一切正常。所以问题要么与 Mac OS Big Sur 有关,要么与我无法识别的开发机器上的特定本地问题有关。任何有关如何诊断此问题的建议将不胜感激。

更多更新:基于猜测,我在我的 Mac 上创建了一个新用户,将代码放入其中,并且运行良好。所以 - 这可能意味着我需要在我的个人资料中找到安装的东西,或者在我自己的个人资料/设置中找到一些破坏性的东西。与往常一样,任何建议都表示赞赏。

stack overflow "GPU process isn't usable. Goodbye."
原文答案

答案:

作者头像

所以 - 部分答案。我想我已经找到了解决这个错误的方法:

GPU process isn't usable. Goodbye.

我的开发目录都在通过符号链接访问的文件系统上。一旦我将此应用程序的文件夹移动到我的主目录(不涉及符号链接),我就可以使用 npm start 启动,而无需启用 no-sandbox 并且不会看到此错误或与 icudtl.dat 相关的错误.

我尚未确定启动打包应用程序时与以下错误描述的问题是否相关/已解决:

The application cannot be opened for an unexpected reason, error=Error Domain=NSOSStatusErrorDomain Code=-10826 "kLSNoLaunchPermissionErr: User doesn't have permission to launch the app (managed networks)" UserInfo={_LSFunction=_LSLaunchWithRunningboard, _LSLine=2561, NSUnderlyingError=0x7fd3c9c13db0 {Error Domain=RBSRequestErrorDomain Code=5 "Launch failed." UserInfo={NSLocalizedFailureReason=Launch failed., NSUnderlyingError=0x7fd3c9c158e0 {Error Domain=NSPOSIXErrorDomain Code=153 "Unknown error: 153" UserInfo={NSLocalizedDescription=Launchd job spawn failed with error: 153}}}}}

也就是说,这是向前迈出的一大步。

作者头像

就我而言,我使用命令行交换机(In-In-Process-GPU)将其用于工作。

app.commandLine.appendSwitch('in-process-gpu');

这里还有大量的铬开关列表,您可以尝试: https://peter.sh/experiments/chromium-command-line-switches/

是的,整个硬运行时的事情真是太可怕了!现在找出下一次崩溃!

作者头像

根本问题似乎是 Mac OS 沙箱阻止了 GPU 进程正常生成。

您可以在打包应用程序时指定多种权利,但并非所有权利都是平等创建的,尤其是希望访问钥匙串、安全飞地和 TouchID 的权利。

如果您指定 provisioning profile - 确保所有这些权利仅在原始文件中,请将您继承的权利保持为空或保持在最低限度。就我而言,我在继承的权利中指定了 keychain-access-groups ,这是一个痛苦的教训。删除它使构建不会崩溃!

我相信在您的情况下,您可能试图访问应用程序本身之外的文件,这可能导致沙箱阻止打开 GPU 进程。