最近我在用 lldb 调试自己的小游戏引擎时遇到一个很烦人的问题。
运行 run 命令后,lldb 会卡住很久,然后直接崩溃,报错:
LLVM ERROR: CachedFileStream was not committed.
而用 gdb 调试是正常的,但每次启动 gdb 都会弹出一行提示:
Enable debuginfod for this session? (y or [n])
我查了很久才发现,原来是环境变量 DEBUGINFOD_URLS=https://debuginfod.archlinux.org 被自动设置了,这个变量是由 /etc/profile.d/debuginfod.sh (来自 libelf 包)在登录时自动加载的,是由arch发行版在打包时添加的功能。
在wiki(https://wiki.archlinuxcn.org/wiki/Debuginfod) 明确提到了这点
我把 DEBUGINFOD_URLS="" 设置后,lldb 立刻就正常了,不再卡顿也不崩溃,调试速度明显变快。
我理解 Arch 引入 debuginfod 是为了方便用户报系统 bug 时能拿到带符号的 backtrace,但我觉得目前这个默认开启的方式不太合适:
- lldb 是静默后台尝试下载的,完全不提示,一出问题就崩溃,非常隐蔽;
- gdb 虽然会询问,但每次都要回答也很麻烦;
- 对于大部分本地开发自己项目的用户来说,其实并不需要自动去网络下载系统库的调试信息,反而增加了网络依赖、缓存开销和不稳定因素。
另外,这个问题还同时碰上了lldb的bug(https://github.com/llvm/llvm-project/issues/184728)
大概描述就是lldb在下载超时时会崩溃,并且无任何输出,这个问题困扰了我很久,看到在github上这个issue还是open状态,看起来llvm一个月还没解决问题,那我们也没办法了
我的建议:
希望 Arch 能把 debuginfod 默认改为不启用,或者至少在安装时给一个明显的提示,让用户自己选择是否开启。这样既保留了功能,又不会给开发者带来不必要的困扰,也更符合 Arch 一贯的 KISS 原则。
有遇到同样问题的吗