我正在构建的一个电子应用程序遇到了一个问题,当我退出应用程序时,我从Mac中得到一个问题报告提示(CMD+Q):“Electron意外退出”。当我为prod构建应用程序时,我得到了相同的错误消息。应用程序实际上并没有意外崩溃或退出。
棘手的部分是我无法复制错误。有时候问题报告不会显示,但对于一些用户来说,它每次都会显示(导致他们认为应用程序崩溃)。
我用以下方式实现了quit:
menu.append(
new MenuItem({
label: 'Temp Str',
submenu: [
{
role: 'quit',
accelerator: process.platform === 'darwin' ? 'Cmd+Q' : 'Alt+f4',
click: () => app.quit(),
},
],
}),
);
这里有什么建议,我如何防止问题报告电子错误消息显示时,有人退出应用程序?这对产品非常不利,因为它会让用户相信应用程序正在崩溃。
FWIW我已经测试了不同的MacOS版本,但遇到了同样的问题。
1条答案
按热度按时间6yt4nkrj1#
**原因:**当您的electron应用程序在退出事件发生时仍在运行代码(未等待事件)时,可能会发生这种情况。如果你有本机库链接,他们可以生成一个错误,如一个中止(),Assert失败,或SEGV当节点试图停止一个线程,目前正在调用到这样的库。
**诊断:**您可以在出现“意外”对话框时,点击“报告”,然后阅读显示的崩溃报告文本,了解更多有关崩溃原因的信息。它将指出哪个线程崩溃了,并且它将包含每个其他线程的当前本机调用堆栈。对我来说,我能够推断出“libvips”(一个本Map像处理依赖项)包含内部Assert失败,这导致了“意外”症状。
**解决方法:您可以通过(A)删除行为不佳的本机依赖,或(B)**等待本机正常完成工作后退出来避免此问题。
对于**(A),如果您可以选择库,请选择一个纯JavaScript的库,或者一个更优雅地处理中断的库。
对于(B)**,您可以通过挂接“before-quit”事件并阻止默认计时来延迟Electron关闭。然后在这个处理程序中,你可以做你自己的清理,然后完成退出。下面是我在应用程序中使用的代码的玩具版本: