调用Bazel调试命令时GDB立即退出的问题排查
一、让GDB保持交互模式,不再立即退出
你遇到的GDB加载符号后直接退出的问题,核心原因是:通过--run_under=gdb启动时,GDB会自动执行你的目标程序,若程序本身是短生命周期(执行后快速结束),GDB也会跟着退出。要让GDB停留在交互状态,需要调整--run_under的参数,让GDB在启动时主动暂停或等待手动操作:
方法1:启动时自动在main函数断点
用以下命令,GDB会先在main函数处设置断点,再启动程序,这样程序会停在断点位置,你可以正常进行调试操作:
bazel run --compilation_mode=dbg --run_under="gdb -ex 'break main' -ex run" //my:target
方法2:启动GDB后手动控制运行
如果你希望自己决定何时启动程序,可以用--args参数让GDB加载目标但不自动运行:
bazel run --compilation_mode=dbg --run_under="gdb --args" //my:target
启动后GDB会停在命令行,你可以输入run启动程序,或者先设置断点再执行运行命令。
关于--direct_run无效的说明
--direct_run只是让Bazel跳过wrapper脚本直接运行二进制,但它不会改变GDB的执行逻辑——如果程序本身执行完就退出,GDB还是会跟着关闭,所以必须结合上面的GDB参数来控制交互行为。
二、解决Perl Locale警告
你看到的Perl locale警告,是因为系统的区域设置存在冲突(部分配置为en_US.ISO-8859-1,部分为de_DE.UTF-8),且系统可能未安装en_US.ISO-8859-1这个locale。可以通过以下方式解决:
方法1:安装缺失的locale
在Debian/Ubuntu类系统上,运行以下命令安装en_US.ISO-8859-1:
sudo locale-gen en_US.ISO-8859-1 sudo update-locale
方法2:统一Locale设置
如果不需要保留en_US.ISO-8859-1,可以将所有Locale设置为UTF-8格式,临时生效可在终端执行:
export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8
若要永久生效,可将这两行添加到~/.bashrc或~/.zshrc文件中,再执行source ~/.bashrc加载配置。
方法3:临时禁用Locale警告
如果只是想忽略警告,可以在运行Bazel命令前强制使用标准C locale:
LC_ALL=C bazel run --compilation_mode=dbg --run_under="gdb --args" //my:target
内容的提问来源于stack exchange,提问作者Mike van Dyke

