You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Electron JS+React JS的时间追踪项目Mac端无响应问题求助

Electron + React 时间追踪Mac端长期运行无响应问题排查建议

问题背景

我基于Electron JS + React JS开发了桌面端时间追踪项目,核心实现方案包括:

  • 使用setTimeout/setInterval更新时间,将mintplus和截图数据存储到本地数据库
  • 通过Better-Queue将数据发送至后端服务器
  • 借助UiHooks统计鼠标操作与按键次数

项目在Windows和Linux系统运行正常,但在不同用户的MacBook上运行一段时间后(时长不定,从一周到两周)会出现无响应情况,目前未找到明确触发规律。已尝试以下方案但未解决:

  • 实现崩溃报告,但未获取有效信息
  • 用Node-Cron替换setTimeout/setInterval,问题依旧

排查方向建议

1. 主线程阻塞排查

  • Mac系统对主线程阻塞更敏感,长期运行后若存在未处理的同步IO、内存泄漏导致的大对象遍历,会触发无响应。可在主进程和渲染进程分别添加CPU占用监控,定时记录process.cpuUsage()和memoryUsage(),当接近阈值时输出详细调用栈。
  • 使用Electron的performanceAPI,在数据库写入、队列发送、钩子统计等关键代码块前后记录耗时,排查是否有长期累积的慢操作。

2. 本地数据库操作优化

  • 检查本地数据库的写入逻辑:如果是高频写入(如每秒/每几秒一次),是否存在未关闭的连接、未提交的事务,长期运行导致连接池耗尽或锁表。尝试将单次写入替换为批量写入,或用事务包裹多次操作。
  • 排查数据库文件的磁盘权限问题:Mac系统沙箱机制可能在长期运行后出现文件访问权限变更,导致数据库操作卡住。在数据库操作失败时增加详细日志,包含错误码和系统权限信息。

3. Better-Queue异常处理检查

  • 检查队列的错误处理逻辑:如果后端服务器偶尔不可达,队列是否存在无限重试、未释放的网络连接?查看队列的failed事件处理,是否有未捕获的异常导致队列阻塞,进而拖垮整个进程。
  • 限制队列的并发数,避免同时发起大量网络请求耗尽Mac系统的网络资源。

4. UiHooks资源泄漏排查

  • 鼠标/键盘钩子属于系统级API,长期运行可能存在内存泄漏或句柄未释放的情况。检查钩子的注册与销毁逻辑:比如应用最小化时是否暂停钩子,恢复时重新注册?是否存在重复注册钩子导致的资源占用累积?
  • Mac系统下,屏幕录制、第三方输入法等工具可能与钩子冲突,导致钩子回调阻塞。可建议用户暂时关闭这类工具,观察问题是否复现。

5. Electron版本与Mac系统兼容性验证

  • 检查当前使用的Electron版本是否存在已知的Mac端长期运行bug,比如旧版本Chromium在Mac上的内存泄漏问题。尝试升级到稳定版最新Electron,同时测试不同Mac系统版本(如Monterey、Ventura、Sonoma)的兼容性。

6. 无响应现场捕获

  • 当用户反馈无响应时,指导用户通过Activity Monitor获取进程的采样报告(点击采样按钮),或使用node-inspect远程连接到Electron进程,查看当前调用栈。这比崩溃报告更能捕获非崩溃性的阻塞问题。

内容的提问来源于stack exchange,提问作者Bilal Khalid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:42:17