解决bazel构建的项目段错误时coredump调试问题
最近在熟悉使用bazel构建项目,遇到了一个**段错误 (核心已转储)**的问题,下面记录一下踩到的坑以及解决的办法
问题复现
首先复现一个简单的coredump问题
tmp.cpp
#include <iostream>
int main(int argc, char **argv)
{
std::cout << "下面产生一个coredump" << std::endl;
int *ptr = nullptr;
*ptr = 42; // 显式触发段错误
return 0;
}
BUILD
cc_binary(
name = "tmp",
srcs = ["tmp.cpp"],
copts = ["-g", "-O0"],
)
使用下面命令build
bazel build //:tmp
然后运行
./bazel-bin/tmp
这个时候可以使用coredumpctl
查看生成的core文件
Fri 2025-01-10 20:16:25 CST 829214 1001 1001 11 present /balabalabala/c82bbfb733a09027e8977ae30cc9c859/execroot/__main__/bazel-out/k8-fastbuild/bin/tmp
使用gdb打开
coredumpctl gdb 829214
在gdb返回的信息中有No debugging symbols found in ...
,说明并没有调试信息,但是我们在BUILD文件中设置了-g
,原因在于调试符号会在构建完成后被移除
解决方案
在项目根目录下新建一个.bazelrc
文件添加下面配置
build --copt=-g # 启用调试符号
build --copt=-O0
build --strip=never # 禁用剥离
然后再
bazel clean
bazel build //:tmp
./bazel-bin/tmp
coredumpctl gdb 829789
就能看到下面调试信息啦:
[New LWP 829789]
Core was generated by `./bazel-bin/tmp'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000055d108ff6973 in main (argc=1, argv=0x7fffe437bdf8) at tmp.cpp:7
7 *ptr = 42; // 显式触发段错误