Electron 收集崩溃日志

2023-11-02

概述

对于任何的客户端应用,开发者都希望能够在用户上的手上记录下相关信息以便了解真实的使用情况。

一般情况下,分为以下两种信息:

  • 正常日志

在不涉及隐私的情况下,让开发者了解用户使用客户端的详细情况,从这些情况中提炼的信息能够让开发者根据用户的使用情况更好地优化产品

  • 崩溃日志

用户的使用环境千差万别,有时候可能会让客户端崩溃。崩溃日志的收集,有利于让开发人员更好地定位,解决问题

对于日志的处理,一般分为 收集 、上报、分析等多个步骤,本文主要细分讲述 Electron 客户端应用的崩溃日志收集步骤, 官方参考: 将崩溃日志提交给远程服务器

大致流程如下:

  1. 开启 Electron Crash Reporter

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

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

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

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捕获 官方建议写在app.on('ready')前
crashReporter.start({
  productName: 'Your-Application-Name',
  companyName: 'Your-Company-Name',
  submitURL: 'https://www.xxx.com',  // 上传到服务器的地址
  uploadToServer: false, // 不上传服务器
  ignoreSystemCrashHandler: false, // 不忽略系统自带的奔溃处理,为 true 时表示忽略,奔溃时不会生成奔溃堆栈文件
});

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

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

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

  • 主进程窗口加载完页面后,增加如下代码:

mainWindow.webContents.on('did-finish-load', function(event){
    mainWindow.webContents.send('crash-file-path', `${crashFilePath} or ${crashDumpsDir}`);
  });
  • 渲染进程页面中增加如下代码:

mainWindow.webContents.on('did-finish-load', function(event){
    mainWindow.webContents.send('crash-file-path', `${crashFilePath} or ${crashDumpsDir}`);
  });
  • 奔溃文件示例及奔溃文件路径日志示例:

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

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

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

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

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() 后写入。

  1. 测试崩溃报告

直接在主进程写入该代码, 就会直接崩溃, 生成崩溃本地文件

// 测试崩溃报告日志
process.crash()
  • 本地开发时程序崩溃示例:

  • 生成本地崩溃文件示例:

  1. 奔溃堆栈文件分析

奔溃堆栈文件的分析,需要 Node.js C++ add-on 程序编译时的符号文件,WIndows下为 dmp 文件,Mac 下为 dSYM 文件,

获取到对应的崩溃文件后,需要对 dump 文件进行分析,推荐工具为 google 的 breakpad。关于 breakpad,不同平台有不同的安装方法,需要各位看官通过官方文档仔细安装(mac 要用 xcode 进行编译,windows需要额外安装 gcc)

假设已经安装好了 breakpad,那么我们会有两个工具:dump_syms 和 minidump_stackwalk,在这里,我们关键会用到 minidump_stackwalk这个工具

通过如下命令行,把 minidump 文件解析并存储结果到 output.txt 中

minidump_stackwalk 15dcad6faa9e9914ae9016d794c391a8 > ./output.txt

  1. 可使用VS打开查看崩溃日志

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Electron 收集崩溃日志 的相关文章

随机推荐

  • Echarts canvas大小和容器不一致

    const ele document getElementById id setTimeout gt 基于准备好的dom 初始化echarts实例 const myChart echarts init ele width document
  • python gui教程pyqt5_Python GUI教程(十五):在PyQt5中使用动画

    QT作为一个全面的桌面应用程序开发包 其自然提供了对图像的动画支持 本篇文章中 就来简单地在PYQt5中使用Animation动画功能 本篇将会依次完成以下功能 在GUI界面中显示一个图片 用一个足球做演示 点击按钮实现足球的直线射门动画
  • 如何选择一个web框架

    几乎对于你想要使用的每一种语言都有大量的web框架 我们在下面的部分列举了一些比较受欢迎的框架 有这么多选择 导致很难决定选择哪个框架为你的新web应用提供最好的开端 一些影响你决定的因素有 学习代价 学习一个web框架取决于你对底层语言的
  • 【华为OD机试】查字典【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 输入一个单词前缀和一个字典 输出包含该前缀的单词 输入描述 单词前缀 字典长度 字典 字典是一个有序单词数组 输入输出都是小写 输出描述 所有包含该前缀的单词 多个单
  • JAVA 日志脱敏实现

    业务诉求 针对敏感数据进行脱敏输出 包括手机号 姓名 密码 身份证号 银行卡号和地址等 一般金融系统和电商系统在审计时要求会比较严格 需要进行脱敏输出 脱敏方案的对比 方案 优点 缺点 适用场景 具体实现 JAVA原生实现 1 适配任意日志
  • 解决【Windows】下CMake不能生成makefile的问题

    遇到这个问题的场景是 PS C Users Administrator Desktop Cplus test build gt cmake Building for Visual Studio 16 2019 Selecting Windo
  • 交互测试。

    最近有接触到一个有趣的名词 交互测试 在对这个名词进行解释之前 我先去特意请教了一个产品经理朋友 问下交互的概念 于是知道了我们的行业里面还有很多个有趣的职位 交互设计师 UE UI 前端 设计 等等等等这些 都是跟这个交互相关 其实看到交
  • idea配置git拉取github上仓库代码

    STEP1 本地下载一个git https git scm com downloads STEP2 打开Settings 配置GitHub账号 决定你是否有权限操作Repository STEP3 配置本地git命令执行地址 也可以配置环境
  • Redis-数据结构及常用命令

    字符串 String 数据结构常用命令 SET key value 设置指定 key 的值 GET key 获取指定 key 的值 DEL key 删除指定 key INCR key 将指定 key 的值增加 1 DECR key 将指定
  • INVALID_USER_SCODE BUG 解决方案

    INVALID USER SCODE 不能定位 这个错误是说你的key有问题 你可以重新更换一下key 就可以了 1 首先先拿到你的SHA1 的值 获取命令 keytool list v keystore E jks gaodenav jk
  • 语义分割——灰度图像转伪彩色图像

    目录 检验灰度图 检验代码 灰度图转伪彩色图代码 转换代码使用细则 示例转换结果 总结 检验灰度图 制作语义分割数据集或用训练好模型测试图像时 得到的结果是灰度图像 如下 检验代码 上面图像灰度值不是全是全为0 灰度范围在 0 1 之间 使
  • android遇到的难题,Android开发遇到的三个问题

    您的位置 首页 教程 IT技术 正文 Android开发遇到的三个问题 总结我在安卓开发过程中遇到的问题 开发工具为Android Studio 编译工具为gradle 一 Execution failed for task mergeDe
  • buck dcm占空比计算_如何计算BOOST转换器的占空比

    计算BOOST变换器的占空比的关键因素 核心是什么 没错 是流过电感的电流 电感属于一个感性元器件 给我的感觉在它身上有很多神秘的色彩 需要一步一步探究 请恕我慢慢道来 其实 如果你上网问一问度娘 BOOST占空比公式 我相信你就直接知道结
  • python中的优先队列PriorityQueue

    普通的队列是一种先进先出的数据结构 元素在队列尾追加 而从队列头删除 在优先队列中 元素被赋予优先级 当访问元素时 具有最高优先级的元素最先删除 优先队列具有最高级先出的行为特征 通常采用堆数据结构来实现 我们可以利用优先队列中元素被赋予优
  • Blinker控制esp8266 01s实现远程控制继电器开关代码

    该代码只实现Blinker通过按钮on和off两种状态来实现继电器的通断 从而控制连接的电路 define BLINKER WIFI 以WIFI方式接入 BLINKER BLE以蓝牙方式接入 include
  • 将摄像头输出的原始数据文件转换成bmp图像

    引言 从摄像头和传感器获得的视频数据是没有办法直接被电脑识别的 所以需要进行转化 我昨天在做项目的时候遇到了这个问题 根据查阅相关资料 实现了将摄像头输出的原始数据文件转换成bmp图像的程序 语言 C C 测试平台 VC6 0 先把bmp
  • scikit-learn官方文档中文版

    scikit learn sklearn 官方文档中文版简介
  • 液态大脑与固态大脑——圣塔菲最新群体智能文集

    来源 The Royal society 撰文 Ricard Sol Melanie Moses and Stephanie Forrest 大脑 神经元构成的器官根植于许多生物体内 这是一种固态的大脑 且组成它们的元素在空间中相对固定 但
  • QML VideoOutput 显示 YUV420P 数据流

    查看VideoOutPut说明文档 对source属性有以下说明 you can provide a QObject based class with a writable videoSurface property that can ac
  • Electron 收集崩溃日志

    概述 对于任何的客户端应用 开发者都希望能够在用户上的手上记录下相关信息以便了解真实的使用情况 一般情况下 分为以下两种信息 正常日志 在不涉及隐私的情况下 让开发者了解用户使用客户端的详细情况 从这些情况中提炼的信息能够让开发者根据用户的