Antigravity Electron39 崩溃排查与修复全记录
作者:wzerovk | 发布时间: | 更新时间:
Antigravity Electron39 崩溃排查与修复全记录
谷糕 antigravity从刚出就开始用了,刚出的时候配合学生订阅疯狂白嫖,帮我做完了一整个R的生信项目,效果很好,但是不知道从哪个弱智版本开始,electron就开始崩溃,倒是也几乎不影响你正常使用,但是通知疯狂报崩溃真的很几把恶心,在网上也没有找到好的解决方案,无非是禁用sandbox和gpu加速,实际上也不好使,想着干脆算了,等更新吧,等到年后了问题依旧,今天掏一上午来跟这个干上了,所幸解决了,AI真强啊,好时代来临力(喜
环境信息
OS: Arch Linux 6.19.11-zen1-1-zen
GPU: NVIDIA 4060 Laptop (驱动 580.142)
软件: antigravity 1.19.6-1 (pacman), 使用 electron39
现象: antigravity 频繁崩溃 (SIGSEGV / SIGTRAP)
排查思路
第一阶段:定位崩溃来源(错误方向)
假设: Electron 在 Linux 上的 GPU 加速/沙箱与 NVIDIA 驱动不兼容(这是最常见的 Electron 崩溃原因)
操作:
coredumpctl list— 查看崩溃记录,确认是 electron39 进程读取
/usr/bin/antigravity启动脚本,发现它会读取~/.config/electron39-flags.conf依次尝试:
--disable-gpu-sandbox→ 仍然崩溃--disable-gpu+--no-sandbox→ 仍然崩溃
关键观察: --no-sandbox 生效了(崩溃命令行里 --enable-sandbox 消失了),但进程还是 SIGSEGV。说明不是 GPU/沙箱问题,假设被证伪。
第二阶段:从 coredump 精确定位崩溃模块(正确方向)
核心思路: coredump 里有完整的内存映射,可以把崩溃的虚拟地址映射回具体的 .so/.node 文件
步骤 1: 获取崩溃地址
从 coredumpctl info 输出中:
Stack trace of thread 277673:
#0 0x00007fed67594775 n/a (n/a + 0x0)
崩溃地址是 0x00007fed67594775,但符号缺失(n/a),无法直接知道是哪个函数。
步骤 2: 获取内存映射表
coredumpctl debug <PID> # 进入 gdb
(gdb) info proc mappings
这会输出进程中所有加载的共享库及其虚拟地址范围,例如:
0x00007fed67554000 0x00007fed67571000 .../watcher.node
0x00007fed67571000 0x00007fed675bf000 .../watcher.node
0x00007fed675bf000 0x00007fed675cc000 .../watcher.node
0x00007fed675cc000 0x00007fed675ce000 .../watcher.node
0x00007fed675ce000 0x00007fed675d0000 .../watcher.node
步骤 3: 匹配地址到文件
崩溃地址 0x7fed67594775 落在 0x7fed67554000 - 0x7fed675ce000 区间内,对应文件:
/usr/lib/antigravity/node_modules/@parcel/watcher/build/Release/watcher.node
而不是 electron39 本身!
步骤 4: 计算文件内偏移
偏移 = 崩溃地址 - 模块基址 = 0x7fed67594775 - 0x7fed67554000 = 0x40775
步骤 5: 用 nm 找到偏移对应的函数
nm watcher.node | sort | awk '{val=strtonum("0x"$1); if(val<=0x40775) last=$0; else {print last; exit}}'
结果:
00000000000406f0 W _ZNSt19_Sp_counted_deleterIP7DirTree14DirTreeDeleterSaIvELN9__gnu_cxx12_Lock_policyE2EE10_M_disposeEv
Demangling: std::_Sp_counted_deleter::_M_dispose()
结论: @parcel/watcher 2.5.1 的 C++ 代码在释放 DirTree 对象时访问了无效内存,导致 SIGSEGV。这是该模块自身的 bug,与 Electron GPU/沙箱无关。
第三阶段:修复
方案: 用 npm 编译更新版本的 @parcel/watcher 替换掉有 bug 的 2.5.1
# 1. 安装 + 编译最新版
mkdir -p /tmp/parcel-watcher-rebuild && cd /tmp/parcel-watcher-rebuild
npm init -y
npm install @parcel/watcher # 下载源码
npx node-gyp rebuild --directory=node_modules/@parcel/watcher # 编译
# 2. 备份 + 替换
sudo cp /usr/lib/antigravity/node_modules/@parcel/watcher/build/Release/watcher.node{,.bak}
sudo cp /tmp/parcel-watcher-rebuild/node_modules/@parcel/watcher/build/Release/watcher.node \
/usr/lib/antigravity/node_modules/@parcel/watcher/build/Release/
# 3. 清理 electron flags(之前误加的)
rm ~/.config/electron39-flags.conf
N-API 模块 ABI 稳定,不受 Node 版本限制,可以安全用系统 node 编译后给 electron 使用。
关键学到的
Electeron 崩溃 ≠ Electron 的锅: 崩溃进程名是 electron,但可能是它加载的任何 .so/.node 出的问题
coredump + info proc mappings 是定位共享库崩溃的根本方法: 虚拟地址 → 地址范围 → 具体文件 → 偏移 → 符号表
N-API (node_api) 模块可以跨 Node 版本使用: 不同于传统的 V8 Addon,N-API 模块 ABI 稳定
GPU/沙箱是最常见原因,但这吊东西不是
修复后维护
备份文件:
/usr/lib/antigravity/node_modules/@parcel/watcher/build/Release/watcher.node.bak新编译文件:
~/Downloads/watcher.nodeantigravity 更新后如果又崩溃,检查版本并替换: