Back

Depuración y Solución de Problemas Comunes en Electron

Depuración y Solución de Problemas Comunes en Electron

Cuando tu aplicación Electron se bloquea, se congela o consume memoria excesiva, encontrar la causa raíz rápidamente es importante. Esta guía proporciona técnicas de depuración prácticas para los problemas más comunes de Electron, enfocándose en qué verificar primero y qué herramientas utilizar.

Puntos Clave

  • Comienza la depuración de bloqueos del renderer abriendo DevTools programáticamente y verificando excepciones no capturadas
  • Configura VS Code correctamente para la depuración del proceso principal con los ajustes adecuados en launch.json
  • Previene fugas de memoria limpiando los listeners de IPC y monitoreando tanto la memoria RSS como heap
  • Siempre deshabilita DevTools y las funciones de depuración en compilaciones de producción usando verificaciones con app.isPackaged

Diagnóstico de Bloqueos y Congelamientos del Proceso Renderer

Verificaciones Rápidas para Problemas del Renderer

Cuando un proceso renderer se bloquea o deja de responder, comienza con estas verificaciones inmediatas:

  1. Abre DevTools programáticamente antes de que ocurra el bloqueo:
win.webContents.openDevTools({ mode: 'detach' });
  1. Verifica la consola en busca de excepciones no capturadas - La mayoría de los bloqueos del renderer provienen de errores de JavaScript no manejados.

  2. Monitorea el uso de memoria a través de la pestaña Performance de Chrome DevTools - Busca picos de memoria antes de los bloqueos.

Depuración del Proceso Renderer con DevTools

Para problemas persistentes del renderer:

  • Habilita el reporte de bloqueos: Agrega win.webContents.on('crashed', (event) => {}) para capturar eventos de bloqueo
  • Usa snapshots de memoria: Toma instantáneas del heap en DevTools (pestaña Memory) para identificar objetos con fugas
  • Deshabilita la aceleración por hardware para pruebas: app.disableHardwareAcceleration() - elimina bloqueos relacionados con la GPU

Verificación rápida: Si el problema desaparece con la aceleración por hardware deshabilitada, has aislado un problema de GPU.

Depuración de Problemas del Proceso Principal

Configuración de Depuración de Electron en VS Code

Configura VS Code para la depuración del proceso principal con este launch.json mínimo:

{
  "type": "node",
  "request": "launch",
  "name": "Debug Main Process",
  "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
  "program": "${workspaceFolder}/main.js",
  "outputCapture": "std"
}

Solución de Problemas del Proceso Principal

Primeros pasos para problemas del proceso principal:

  1. Verifica stdout/stderr: Agrega "outputCapture": "std" para ver errores de módulos nativos
  2. Establece breakpoints en eventos del ciclo de vida (app.on('ready'), app.on('before-quit'))
  3. Monitorea la memoria del proceso: Usa process.memoryUsage() para registrar valores RSS

Enfoques de remediación:

  • Para RSS alto: Verifica referencias retenidas de BrowserWindow - asegura win = null después del cierre
  • Para bloqueos: Habilita core dumps con app.setPath('crashDumps', path)
  • Para congelamientos: Perfila el uso de CPU con el flag --inspect y Chrome DevTools

Fugas de Memoria y RSS Alto

Técnicas de Perfilado de Memoria en Electron

Identifica fugas de memoria sistemáticamente:

  1. Compara snapshots del heap: Toma instantáneas antes y después de operaciones sospechosas de fugas
  2. Monitorea RSS vs heap: RSS incluye memoria nativa - si RSS crece pero el heap no, verifica módulos nativos
  3. Rastrea listeners de IPC: Los listeners no registrados son fuentes comunes de fugas

Prevención de Fugas de Listeners de IPC

Patrón común de fuga de memoria en IPC:

// MALO: Crea un nuevo listener en cada render
ipcRenderer.on('data-update', handler);

// BUENO: Remueve al desmontar
const handler = (event, data) => { /* ... */ };
ipcRenderer.on('data-update', handler);
// En la limpieza:
ipcRenderer.removeListener('data-update', handler);

Verificación: Verifica el conteo de listeners con ipcRenderer.listenerCount('event-name')

Problemas de Configuración y Seguridad

Prevención de Exposición del Modo de Depuración

Verificaciones críticas de producción:

  1. Deshabilita DevTools en producción:
if (app.isPackaged) {
  win.webContents.on('devtools-opened', () => {
    win.webContents.closeDevTools();
  });
}
  1. Elimina elementos de menú de depuración: Remueve opciones de depuración de los menús de producción
  2. Deshabilita el módulo remoto: Establece enableRemoteModule: false en webPreferences

Cuándo Escalar

Crea una reproducción mínima antes de reportar problemas:

  1. Aísla el problema: Elimina todo el código no esencial
  2. Prueba con Electron vanilla: Usa minimal-repro como línea base
  3. Documenta con precisión: Incluye números exactos de RSS/heap, versión de Electron y plataforma

Al reportar problemas de Electron/Chromium, proporciona:

  • Código mínimo reproducible
  • Mediciones de memoria (RSS y heap)
  • Tipo de proceso afectado (main/renderer)
  • Volcados de bloqueo si están disponibles

Mejores Prácticas

Tres Prácticas Esenciales de Depuración

  1. Asegura las compilaciones de producción: Siempre verifica app.isPackaged antes de habilitar funciones de depuración. Nunca distribuyas con DevTools accesible.

  2. Limpia los listeners de IPC: Implementa un patrón de limpieza para todos los listeners de IPC. Usa removeListener() o removeAllListeners() al desmontar componentes.

  3. Monitorea RSS junto con heap: Los snapshots del heap de JavaScript no muestran memoria nativa. Siempre rastrea process.memoryUsage().rss para una investigación completa de memoria.

Consejo final: Para escenarios de depuración complejos, usa electron-debug para agregar atajos de DevTools y otras funciones de depuración con configuración mínima.

Conclusión

La depuración de aplicaciones Electron requiere un enfoque sistemático para identificar si los problemas se originan en el proceso principal o en el renderer. Al usar las herramientas correctas—desde DevTools para problemas del renderer hasta la depuración de VS Code para problemas del proceso principal—puedes aislar y corregir rápidamente bloqueos, fugas de memoria y problemas de rendimiento. Recuerda siempre asegurar tus compilaciones de producción y mantener patrones limpios de comunicación IPC para prevenir que ocurran problemas comunes desde el principio.

Preguntas Frecuentes

Las aplicaciones Electron incluyen un navegador Chromium completo y el runtime de Node.js para cada ventana. Esta sobrecarga base significa que incluso aplicaciones simples usan 50-100MB. Monitorea tanto la memoria heap como RSS para distinguir entre memoria de JavaScript y uso de módulos nativos.

Inicia Electron con el flag --enable-logging para capturar errores tempranos. Agrega declaraciones console.log al principio de tu archivo del proceso principal. Si usas módulos nativos, verifica que coincidan con tu versión de Electron con electron-rebuild.

El proceso principal ejecuta código Node.js y gestiona el ciclo de vida de la aplicación. Depúralo con VS Code o el flag --inspect. El proceso renderer ejecuta contenido web y usa Chrome DevTools. Cada uno requiere diferentes herramientas y enfoques de depuración.

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay