本文档详细介绍 Electron 应用的调试方法,包括渲染进程调试、主进程调试、以及各种调试技巧和最佳实践。
适用版本: Electron 20+ 难度等级: ⭐⭐ 中级
渲染进程(Renderer Process)负责显示应用界面,调试方法与普通网页开发类似,可以使用 Chrome DevTools。
适用场景: 日常开发调试
操作步骤:
优点:
操作示例:

手动打开 DevTools
适用场景: 需要每次启动时自动打开调试工具
实现方法:
在 main.js 文件的 createWindow() 函数中,添加 openDevTools() 调用:
const { app, BrowserWindow } = require('electron');
const path = require('path');
let mainWindow;
function createWindow() {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
preload: path.join(__dirname, 'preload.js')
}
});
mainWindow.loadFile('index.html');
// 自动打开开发者工具
mainWindow.webContents.openDevTools();
}
app.whenReady().then(() => {
createWindow();
});
代码说明:
mainWindow.webContents.openDevTools() - 打开开发者工具
可以添加参数控制 DevTools 的位置和模式:
// 在右侧打开(默认)
mainWindow.webContents.openDevTools();
// 在底部打开
mainWindow.webContents.openDevTools({ mode: 'bottom' });
// 分离窗口
mainWindow.webContents.openDevTools({ mode: 'detach' });
运行效果:

自动打开 DevTools
优点:
缺点:
生产环境优化:
// 只在开发环境打开 DevTools
if (process.env.NODE_ENV === 'development') {
mainWindow.webContents.openDevTools();
}
HarmonyOS PC:
Ctrl + Shift + I - 打开/关闭 DevToolsWindows/Linux:
Ctrl + Shift + I - 打开/关闭 DevToolsF12 - 打开/关闭 DevToolsmacOS:
Cmd + Option + I - 打开/关闭 DevToolsCmd + Option + J - 打开控制台注意: 快捷键需要在窗口获得焦点时才能使用。
打开 DevTools 后,可以使用以下功能:
主进程(Main Process)负责管理应用生命周期和创建窗口,调试相对复杂一些。
推荐方案: 使用 VS Code 的调试功能
在项目根目录创建 .vscode/launch.json 文件:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Main Process",
"type": "node",
"request": "launch",
"cwd": "${workspaceFolder}",
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
"windows": {
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd"
},
"args": [
"."
],
"outputCapture": "std",
"console": "integratedTerminal"
},
{
"name": "Debug Main Process (with DevTools)",
"type": "node",
"request": "launch",
"cwd": "${workspaceFolder}",
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
"windows": {
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd"
},
"args": [
".",
"--remote-debugging-port=9222"
],
"outputCapture": "std",
"console": "integratedTerminal"
}
]
}
main.js 中设置断点(点击行号左侧)F5 或点击"运行和调试"调试功能:
在启动 Electron 时添加 --inspect 参数:
# 方式一:命令行启动
electron --inspect=9222 .
# 方式二:修改 package.json
{
"scripts": {
"start": "electron .",
"debug": "electron --inspect=9222 ."
}
}
chrome://inspect注意: 需要 Chrome 浏览器版本 55+。
最简单的方法,在主进程中添加日志:
const { app, BrowserWindow } = require('electron');
console.log('应用启动中...');
console.log('Node 版本:', process.versions.node);
console.log('Electron 版本:', process.versions.electron);
function createWindow() {
console.log('创建窗口...');
const mainWindow = new BrowserWindow({
width: 800,
height: 600
});
console.log('窗口创建完成');
mainWindow.loadFile('index.html');
}
查看日志:
只在特定条件下打开 DevTools:
function createWindow() {
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
preload: path.join(__dirname, 'preload.js')
}
});
mainWindow.loadFile('index.html');
// 开发环境自动打开 DevTools
if (process.env.NODE_ENV === 'development' ||
process.argv.includes('--dev')) {
mainWindow.webContents.openDevTools();
}
}
启动时指定环境变量:
# Windows
set NODE_ENV=development && npm start
# macOS/Linux
NODE_ENV=development npm start
# 或使用命令行参数
npm start -- --dev
如果有多个窗口,可以为每个窗口单独控制 DevTools:
function createWindow() {
const mainWindow = new BrowserWindow({
width: 800,
height: 600
});
const secondWindow = new BrowserWindow({
width: 600,
height: 400
});
mainWindow.loadFile('index.html');
secondWindow.loadFile('second.html');
// 只为主窗口打开 DevTools
if (process.env.NODE_ENV === 'development') {
mainWindow.webContents.openDevTools();
}
}
允许从外部连接调试:
// main.js
const { app, BrowserWindow } = require('electron');
// 启动时添加远程调试端口
app.commandLine.appendSwitch('remote-debugging-port', '9222');
function createWindow() {
const mainWindow = new BrowserWindow({
width: 800,
height: 600
});
mainWindow.loadFile('index.html');
}
app.whenReady().then(() => {
createWindow();
});
然后可以在 Chrome 中访问 http://localhost:9222 进行调试。
使用 Chrome DevTools 的性能分析工具:
// 在代码中标记性能点
console.time('窗口创建');
const mainWindow = new BrowserWindow({...});
console.timeEnd('窗口创建');
在 DevTools 的 Performance 面板中:
检查内存泄漏:
// 定期输出内存使用情况
setInterval(() => {
const memUsage = process.memoryUsage();
console.log('内存使用:', {
rss: `${Math.round(memUsage.rss / 1024 / 1024)} MB`,
heapTotal: `${Math.round(memUsage.heapTotal / 1024 / 1024)} MB`,
heapUsed: `${Math.round(memUsage.heapUsed / 1024 / 1024)} MB`
});
}, 5000);
使用 DevTools 的 Memory 面板:
监控网络请求:
// 监听所有网络请求
mainWindow.webContents.on('did-finish-load', () => {
mainWindow.webContents.debugger.attach('1.1');
mainWindow.webContents.debugger.on('message', (event, method, params) => {
if (method === 'Network.responseReceived') {
console.log('网络请求:', params.response.url);
}
});
});
或在 DevTools 的 Network 面板中直接查看。
问题: 点击按钮或快捷键无法打开 DevTools
解决方案:
检查窗口焦点
// 确保窗口获得焦点
mainWindow.focus();
检查 webPreferences 配置
webPreferences: {
devTools: true // 确保未禁用 DevTools
}
手动调用 API
mainWindow.webContents.openDevTools();
问题: VS Code 中设置断点但程序不暂停
解决方案:
launch.json 配置是否正确问题: 终端输出中文乱码
解决方案:
// 设置输出编码
process.stdout.setEncoding('utf8');
process.stderr.setEncoding('utf8');
或在启动时设置环境变量:
# Windows
chcp 65001 && npm start
# macOS/Linux
export LANG=zh_CN.UTF-8 && npm start
问题: 调试时应用无响应
解决方案:
console.log 定位卡死位置electron-debug - Electron 调试工具包
npm install --save-dev electron-debug
使用:
require('electron-debug')({ showDevTools: true });
开发环境自动打开 DevTools
if (process.env.NODE_ENV === 'development') {
mainWindow.webContents.openDevTools();
}
使用条件断点
合理使用 console.log
定期检查性能
版本控制忽略调试配置
# .gitignore
.vscode/launch.json # 个人调试配置
参考资料
[1]
一、渲染进程调试: #一渲染进程调试
[2]
二、主进程调试: #二主进程调试
[3]
三、调试技巧与最佳实践: #三调试技巧与最佳实践
[4]
四、常见问题排查: #四常见问题排查
[5]
五、调试工具推荐: #五调试工具推荐
[6]
Electron 官方调试文档: https://www.electronjs.org/docs/latest/tutorial/debugging
[7]
Chrome DevTools 文档: https://developer.chrome.com/docs/devtools/
[8]
VS Code 调试文档: https://code.visualstudio.com/docs/editor/debugging
[9]
Electron 调试最佳实践: https://www.electronjs.org/docs/latest/tutorial/debugging-main-process