Electron应用程序在退出应用程序时在Mac上抛出意外退出错误消息

fzsnzjdm  于 12个月前  发布在  Electron
关注(0)|答案(1)|浏览(408)

我正在构建的一个电子应用程序遇到了一个问题,当我退出应用程序时,我从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版本,但遇到了同样的问题。

6yt4nkrj

6yt4nkrj1#

**原因:**当您的electron应用程序在退出事件发生时仍在运行代码(未等待事件)时,可能会发生这种情况。如果你有本机库链接,他们可以生成一个错误,如一个中止(),Assert失败,或SEGV当节点试图停止一个线程,目前正在调用到这样的库。
**诊断:**您可以在出现“意外”对话框时,点击“报告”,然后阅读显示的崩溃报告文本,了解更多有关崩溃原因的信息。它将指出哪个线程崩溃了,并且它将包含每个其他线程的当前本机调用堆栈。对我来说,我能够推断出“libvips”(一个本Map像处理依赖项)包含内部Assert失败,这导致了“意外”症状。
**解决方法:您可以通过(A)删除行为不佳的本机依赖,或(B)**等待本机正常完成工作后退出来避免此问题。

对于**(A),如果您可以选择库,请选择一个纯JavaScript的库,或者一个更优雅地处理中断的库。
对于
(B)**,您可以通过挂接“before-quit”事件并阻止默认计时来延迟Electron关闭。然后在这个处理程序中,你可以做你自己的清理,然后完成退出。下面是我在应用程序中使用的代码的玩具版本:

const {app} = require('electron');

let nativeWorkRunning = 0;
let isStopping = false;

app.on('before-quit', async e => {
   e.preventDefault();  // stops the quit from happening
   isStopping = true;
   while (nativeWorkRunning) {
     await sleep(100);  // wait for native work
   }
   app.exit();  // immediate exit
});

function myNativeFunction() {
  if (isStopping) {
    return false;  // don't let new native calls through
  }
  try {
    nativeWorkRunning++;
    my_native_module.do_whatever();
  } finally {
    nativeWorkRunning--;
  }
}

function sleep() {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

相关问题