“GPU 进程不可用。再见。”
Posted
技术标签:
【中文标题】“GPU 进程不可用。再见。”【英文标题】:"GPU process isn't usable. Goodbye." 【发布时间】:2021-10-22 18:16:42 【问题描述】:我正在尝试使用 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 安装程序,那么这将不适合。
如果我从main.js
中删除上述no-sandbox
命令并在我的权利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 上创建了一个新用户,将代码放入其中,并且运行良好。所以 - 这可能意味着我需要在我的个人资料中找到安装的东西,或者在我自己的个人资料/设置中找到一些破坏性的东西。一如既往,任何建议都表示赞赏。
【问题讨论】:
这是我见过的最好的错误信息,哈哈 “我说真的,所有希望都破灭了。” 由于在谷歌领域缺乏任何真正的洞察力,我肯定会失去希望。if (fallback_modes_.empty()) .. intentionallyCrash..)
在ChromiumSource:415->1705 中找到。它可以从 4 个不同的函数中调用,而且似乎不是一个后备。它只是非常非常丑陋的谷歌代码!意味着这不是沙盒问题,而是回退问题。检查您的 GPU 模式设置
更准确.. // With Vulkan or Metal, GL might be blocked, so make sure we don't fallback to it later.
只是说 MacOS BigSur 不再支持 GL。您必须阅读 Electron 如何处理此更改..
【参考方案1】:
所以——部分答案。我想我已经找到了解决这个错误的方法:
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
也就是说,这是向前迈出的一大步。
【讨论】:
***.com/questions/64842819/… @iLuvLogix 谢谢,但已经看到并尝试过了。没用。似乎与权利和/或代码签名有某种关系(即,可能不是使用正确的证书)。【参考方案2】:就我而言,我使用命令行开关 --in-process-gpu 或:
app.commandLine.appendSwitch('in-process-gpu');
这里还有大量 Chromium 开关列表,您可以尝试: https://peter.sh/experiments/chromium-command-line-switches/
是的,整个强化运行时的东西真是太糟糕了,太糟糕了!现在来找出下一次崩溃!
【讨论】:
【参考方案3】:根本问题似乎是 Mac OS 沙盒正在阻止 GPU 进程正常生成。
您可以在打包应用程序时指定各种权利,但并非所有权利都是平等创建的,尤其是想要访问钥匙串、安全飞地和 TouchID 的权利。
如果您指定 provisioning profile
- 确保所有这些权利仅在原始文件中,请将您继承的权利保持为空或保持在最低限度。就我而言,我在继承的权利中指定了keychain-access-groups
,这是一个痛苦的教训。删除它使构建不会崩溃!
我相信在您的情况下,您可能试图访问应用程序本身之外的文件,这可能导致沙箱阻止打开 GPU 进程。
【讨论】:
以上是关于“GPU 进程不可用。再见。”的主要内容,如果未能解决你的问题,请参考以下文章