WSL2中使用Bear生成compile_commands.json失败及解决后疑问
WSL2下Bear生成compile_commands.json时gRPC连接失败的解决与原理
环境
- 操作系统:
WSL2 on Windows11,Ubuntu 22.04.3 LTS x86_64 - Bear版本:
3.0.18(apt安装)
问题
执行bear -- make生成编译数据库时失败,报错:
wrapper: failed with: gRPC call failed: failed to connect to all addresses
生成的compile_commands.json为空,但单独运行make可正常编译:
gcc -Wall -Iinclude src/main.c -o main
项目结构:
. ├── Makefile ├── compile_commands.json ├── include │ └── inc.h ├── main └── src └── main.c
试过Bear官方排障方案(设置no_proxy=localhost,127.0.0.1、GRPC_DNS_RESOLVER=native,清空http_proxy/https_proxy),均无效,verbose日志显示supervise::Supervisor::Resolve这个gRPC调用失败。
解决办法
编辑Windows用户目录下的.wslconfig文件,启用networkingMode=mirrored:
[experimental] autoMemoryReclaim=gradual networkingMode=mirrored dnsTunneling=true firewall=true autoProxy=true sparseVhd=true
保存后重启WSL2,再执行bear -- make即可正常生成compile_commands.json。
为什么这个修改有效?
Bear的工作原理依赖gRPC进行本地进程间通信,而WSL2默认的NAT网络模式存在以下问题:
- NAT模式下WSL2拥有独立的虚拟网络命名空间,本地回环地址(127.0.0.1/localhost)仅在WSL内部生效,但Bear的gRPC调用可能尝试通过Windows主机的网络栈解析本地地址,导致跨命名空间的连接失败。
mirrored网络模式让WSL2直接共享Windows主机的网络栈,WSL的回环地址与主机回环完全映射,消除了网络隔离带来的本地连接障碍,Bear的gRPC进程间通信可以正常建立。
strace的网络跟踪输出也证实了问题核心是本地网络连接失败,mirrored模式从根源上解决了WSL2与主机间的本地网络互通问题。
内容的提问来源于stack exchange,提问作者V Friedrich
相关产品推荐
相关产品推荐

