Source Directory
gcc / g++ 编译时,如果启用 -g
选项,会把调试信息写进 ELF 文件中。这些信息里面,包含某些二进制代码所对应的源文件和相应行数,用来给 GDB 调试时显示源代码文件。有些构建系统会以相对路径(Bazel)写入这些文件,有些则会以绝对路径(如 CMake)。gdb 默认会从 $cdir
(directory embedded in executable recorded during compilation) 和 $cwd
(current working directory) 这两个地方去查找源文件,而且就算打断点时你给了绝对路径也没有用,gdb 还是会去上述两个目录找。
比如你有个 main.c
在编译时的当前目录下,那么编译出来,它的调试信息中,文件路径是 ./main.c
。你在 gdb 调试时,用 breakpoint main.c:20
是 OK 的,但是你用它的绝对路径,breakpoint /home/onlyice/main.c:20
则不行,会报 No source file named /home/onlyice/main.c
。
在使用 Bazel 编译 istio/proxy 时,发现 Bazel 编译出来的调试信息也是用的相对路径。而用 CLion 去调试时,要把 Run Configuration 中的 Current Working Directory 设为项目的根目录,不然打的断点不会停下来,因为上面所描述的原因。