Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Electron 应用奔溃问题排查与解决方法

Electron 应用奔溃问题排查与解决方法

原创
作者头像
笑若海
修改于 2022-10-13 06:32:09
修改于 2022-10-13 06:32:09
10.9K0
举报

1 常见的导致 Electron 应用奔溃原因

1.1 JavaScript 层可能导致的奔溃

  • 传给 WebGL 渲染的ArrayBuffer,实际宽或高为零
  • 图片宽或高为零,传给 Canvas 绘制
  • Electron 12 及以下版本,来自 node.js C++ add-on 层的 ArrayBuffer,必须复制一次,否则渲染进程会奔溃。相关 Bug 地址:https://github.com/electron/electron/issues/15538

1.2 设备访问权限

1.3 C++ 层导致的奔溃

存在 Node.js C++ add-on 相关的代码时,这一层导致应用程序奔溃的可能行极大,常见原因有:

  • 空指针访问
  • 数组越界
  • Node.js C++ add-on API 错误调用、参数错误等

2 Electron 应用奔溃处理方法

2.1 JavaScript 层导致奔溃

针对 JavaScritpt 导致奔溃,需要找到奔溃出现路径,一步步调试基本可以发现问题原因,做一些防御性编程就可以规避。

2.2 Node.js C++ add-on 层导致的奔溃

这一次导致的奔溃问题,一般比较难排查,特别是针对前端开发人员,这里给出的解决方案是:(1)开起 Electron Crash Reporter 功能,获取奔溃堆栈,分析堆栈内容;(2)监听 Electron crash 相关事件,记录crash 日志。

2.2.1 开启 Electron Crash Reporter

开起后,可以收集 Electron 应用的奔溃堆栈,Electron Crash Reporter 支持将奔溃堆栈上传到在线的第三方服务平台,用户也可以通过配置上传自己的服务器(服务端需要自己开发),也可以只生成奔溃堆栈文件在本地,用于排查奔溃问题。下面将只介绍如何生成奔溃堆栈文件到本地。

2.2.1.1 开启奔溃堆栈文件生成,并获取奔溃文件存放路径

需要在 main 进程的 JavaScript 代码中,在一开始的位置添加如下代码,开启 Electron Crash Reporter 捕获功能。

代码语言:txt
AI代码解释
复制
const { app, BrowserWindow, crashReporter, ipcMain, systemPreferences } = require('electron');
const path = require('path');

// 获取奔溃堆栈文件存放路径
let crashFilePath = '';
let crashDumpsDir = '';
try {
  // electron 低版本
  crashFilePath = path.join(app.getPath('temp'), app.getName() + ' Crashes');
  console.log('————————crash path:', crashFilePath); 

  // electron 高版本
  crashDumpsDir = app.getPath('crashDumps');
  console.log('————————crashDumpsDir:', crashDumpsDir);
} catch (e) {
  console.error('获取奔溃文件路径失败', e);
}

// 开启crash捕获
crashReporter.start({
  productName: 'Your-Application-Name',
  companyName: 'Your-Company-Name',
  submitURL: 'https://www.xxx.com',  // 上传到服务器的地址
  uploadToServer: false, // 不上传服务器
  ignoreSystemCrashHandler: false, // 不忽略系统自带的奔溃处理,为 true 时表示忽略,奔溃时不会生成奔溃堆栈文件
});

以上代码不能保证每次奔溃,都收集到奔溃堆栈,但如果奔溃较频繁,很可能在某次奔溃时生成,如果发现生成了奔溃堆栈,一定不要视而不见,对于偶现的奔溃问题,奔溃堆栈文件对定位排查问题很有帮助。

2.2.1.2 将奔溃堆栈文件存放目录写到渲染进程日志

通过安装包执行的应用,Electron 主进程的日志通常看不到或者不好查阅(可借助 Node.js 文件 API 写本地日志文件),可以将奔溃堆栈文件的存放路径打印到渲染进程的控制台,方便查询。实现方式参阅下方代码。

  • 主进程 窗口加载完页面后,增加如下代码:
代码语言:txt
AI代码解释
复制
mainWindow.webContents.on('did-finish-load', function(event){
    mainWindow.webContents.send('crash-file-path', `${crashFilePath} or ${crashDumpsDir}`);
  });
  • 渲染进程 preload 中增加如下代码:
代码语言:txt
AI代码解释
复制
const { ipcRenderer } = require('electron');

ipcRenderer.on('crash-file-path', (event, args) => {
  console.warn('crash-file-path:', args);
});
  • 奔溃文件示例及奔溃文件路径日志示例 如下图,奔溃文件可能在奔溃文件存放目录下的 new、completed、pending 目录下:
image.png
image.png

2.2.2 监听 Electron 渲染进程和 GPU 进程奔溃事件

Electron 提供了监听渲染进程和 GPU 进程奔溃的事件接口,监听这些事件,可以知道何时发生了奔溃,但奔溃的具体原因一般看不出来,需要获取奔溃堆栈的 dump 文件。

在 Electron main 进程的启动脚本,增加如下代码,监听奔溃事件,可以把这些日志写入本地文件。

注意:此时渲染进程可能已经奔溃,不能发送给渲染进程打印到窗口的控制台,奔溃事件的日志最好写到本地文件或者发送个服务端。

代码语言:txt
AI代码解释
复制
app.on('gpu-process-crashed', (event, kill) => {
  console.warn('app:gpu-process-crashed', event, kill);
});

app.on('renderer-process-crashed', (event, webContents, kill) => {
  console.warn('app:renderer-process-crashed', event, webContents, kill);
});

app.on('render-process-gone', (event, webContents, details) => {
  console.warn('app:render-process-gone', event, webContents, details);
});

app.on('child-process-gone', (event, details) => {
  console.warn('app:child-process-gone', event, details);
});

注意:event 和 webContents 对象直接写文件,可以 JSON.stringify() 后写入。

2.2.3 奔溃堆栈文件分析

奔溃堆栈文件的分析,需要 Node.js C++ add-on 程序编译时的符号文件,WIndows下为 pdb 文件,Mac 下为 dSYM 文件,需要找相关的 C++ 开发人员处理。针对 腾讯云实时音视频 SDK 的奔溃,可以通过 QQ 群:695855795 ,联系 腾讯云实时音视频 开发人员,帮忙分析。分析奔溃堆栈文件需要提供:奔溃堆栈文件、SDK 版本号、操作系统平台信息、SDK本地日志(非必须,最好提供).

  • SDK 本地日志路径,可以参阅相关 API 文档
image.png
image.png
  • QQ 群:695855795

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
NodeJS日志记录(Electron项目)
electron-log supports the following log levels:
码客说
2021/07/07
3.1K0
electron开发技术知识点笔记
GYP是一种构建自动化工具。node程序中需要调用一些其他语言编写的 工具 甚至是dll,需要先编译一下,否则就会有跨平台的问题,例如在windows上运行的软件copy到mac上就不能用了,但是如果源码支持,编译一下,在mac上还是可以用的。node-gyp在较新的Node版本中都是自带的(平台相关),用来编译原生C++模块。
huahuadavids
2022/10/21
1.6K0
Electron启程
Electron 可以让你使用纯 JavaScript 调用丰富的原生(操作系统) APIs 来创造桌面应用。 你可以把它看作一个 Node. js 的变体,它专注于桌面应用而不是 Web 服务器端。
码客说
2019/10/21
5.8K1
Electron入门教程3 ——进程通信
在Electron中,进程通过开发人员定义的“通道”与ipcMain模块和ipcRenderer模块进行通信。这些通道是任意的(您可以任意命名它们)和双向的(您可以为两个模块使用相同的通道名称)。要从渲染进程向主进程发送单向IPC消息,可以再预渲染脚本preload.js里使用ipcRenderer发送API发送消息,然后在main.js里用ipcMain.on接收。你通常使用这个模式从你的web内容中调用一个主进程API。我们将通过创建一个简单的应用程序来演示这种模式,该应用程序可以通过编程方式更改窗口的标题。
害恶细君
2022/11/22
1.4K0
Electron入门教程3 ——进程通信
Electron实践笔记
社交魔方平台是京东的 SNS 活动搭建平台,其内置了很多模板,每一个模板都有一个模板 JSON 用于生成表单,运营同学、商家配置了这个表单后就可以生成活动页面了。模板 JSON 是标准的结构化数据,包含名称、类型、控件类型、校验器、默认值等等字段。以往都是采用手写 JSON 的方式,这是非常低效的,而且容易出错。针对其结构化数据的特点可以用 GUI 的方式去编辑,我们基于 Electron[1] 参考 Github Desktop 客户端[2] 的架构编写了一个 JSON 编辑器(参见下图),通过填写表单的方式生成 JSON。所以在这里记录下这个 Electron 编辑器开发过程中可以记录的点和从 Github Desktop 客户端代码中值得学习的点。
前端迷
2019/10/22
1.1K0
预加载脚本 | Electron 安全
相信看了前面的文章,大家对于预加载脚本已经非常了解了,对于之前篇章中已经测试并解释清楚的部分,不会再次详细解释
意大利的猫
2024/04/22
6770
预加载脚本 | Electron 安全
electron 进程间通信
通过前面的学习,我们知道在Electron中,主进程和渲染进程是被换分成不同的功能的,主进程有完整的Node环境,而渲染进程默认是运行的是浏览器环境。这样划分的好处是:
友儿
2024/03/27
4550
Electron各版本API变更及版本升级报错汇总
每个版本都有废弃和移除的API,废弃的依旧可以用,所以这里只列一些常用的被移除的API及对应的替换方法。
码客说
2021/09/30
1.9K0
我的第一个Electron应用
hello,好久不见,最近笔者花了几天时间入门Electron,然后做了一个非常简单的应用,本文就来给各位分享一下过程,Electron大佬请随意~
街角小林
2023/05/31
1.5K0
我的第一个Electron应用
Electron 快速入门,顺便聊聊 IPC 通信
前阵子将排课系统的一些功能,提供给 solar 编辑器使用,solar 是基于互动课件编辑器 Cocos ICE 进行二次定制和个性化开发的课件制作系统,其底层是 Cocos Creator。而 Cocos Creator 是基于 Electron 进行开发的,所以学习了一些关于 Electron IPC 通信的相关知识,在这里做一个总结。 文章的开始,先让我们来了解下 Electron 是什么。 1. 什么是 Electron? Electron 官网只有一句简单的话: 使用 JavaScript,HTM
用户1097444
2022/06/29
2K0
Electron 快速入门,顺便聊聊 IPC 通信
Electron 进程通信
当我们执行 electron . 命令后, Electron 会运行当前目录(.)下的 package.json 文件中 main 字段指定的文件。而运行该文件的进程既是主进程。
IMWeb前端团队
2019/12/03
1.7K0
contextIsolation | Electron 安全
大家好,今天和大家讨论的是 Electron 的另一个大的安全措施 —— contextIsolation 即上下文隔离
意大利的猫
2024/04/22
8750
contextIsolation | Electron 安全
Electron+Vue使用Nodejs开发爬虫
String - You can request the following paths by the name:
码客说
2020/11/13
1.7K0
Electron 介绍
​ Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium (opens new window) 和 Node.js (opens new window) 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。
郭顺发
2021/12/17
2.6K0
Electron 介绍
Electron框架 介绍
Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。
郭顺发
2023/07/17
8310
用 Electron 将 UniApp 封装为 EXE 指南
最近想要制作一个 Windows 工具箱,所以需要多集合一些功能。之前用 uniapp 制作了一些功能,为了省事,所以想要把部分 uniapp 封装成 exe 来丰富功能。
繁依Fanyi
2025/02/22
6430
用 Electron 将 UniApp 封装为 EXE 指南
用JS开发跨平台桌面应用,从原理到实践
使用Electron开发客户端程序已经有一段时间了,整体感觉还是非常不错的,其中也遇到了一些坑点,本文是从【运行原理】到【实际应用】对Electron进行一次系统性的总结。【多图,长文预警~】
ConardLi
2019/06/15
7.4K0
如何用Vue开发Electron桌面程序? 这篇就够了!
Electron 是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目. 使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序
治电小白菜
2021/01/05
7.7K2
如何用Vue开发Electron桌面程序? 这篇就够了!
内容劫持 | Electron 安全
很多使用 Electron 开发的程序关闭了所有的安全措施,但是仍旧没有被攻击,因为很多攻击的前提是存在 XSS ,有了 XSS 就如鱼得水,因此很多问题就被掩盖了
意大利的猫
2024/04/22
4720
内容劫持 | Electron 安全
nodeIntegrationInSubFrames | Electron 安全
大家好,今天和大家讨论 nodeIntegrationInSubFrames , 这个选项看起来和 nodeIntegration 很像,不过后面跟了 InSubFrames ,说明是在 SubFrames 中开启 Node.js
意大利的猫
2024/05/08
5590
nodeIntegrationInSubFrames | Electron 安全
相关推荐
NodeJS日志记录(Electron项目)
更多 >
LV.1
这个人很懒,什么都没有留下~
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档