使用gdb&bazel(&emacs)进行C++调试

Pic*_*ent 9 c++ emacs gdb bazel

我想调试用Bazel生成的可执行文件.使用Bazel生成的链接丢失了gdb调试器,并且无法向我显示C++源代码.如何解决?

项目根目录是/home/.../Cpp/

./Cpp/
??? bazel-bin -> /home/picaud/.cache/bazel/_bazel_picaud...
??? bazel-Cpp -> /home/picaud/.cache/bazel/_bazel_picaud...
??? bazel-genfiles -> /home/picaud/.cache/bazel/_bazel_picaud...  
??? bazel-out -> /home/picaud/.cache/bazel/_bazel_picaud...   
??? bin
?   ??? BUILD
?   ??? main.cpp
??? MyLib
?   ??? BUILD
?   ??? ....hpp
?   ???  ...cpp
??? WORKSPACE
Run Code Online (Sandbox Code Playgroud)

Pic*_*ent 15

所述第一步骤是使用调试模式,以产生可执行文件:

bazel build ... --compilation_mode=dbg -s
Run Code Online (Sandbox Code Playgroud)

(-s选项不是必需的,它只显示已执行的命令,如果需要,可以将其删除)

从命令行调试gdb:

您可以使用命令启动gdb(从项目根目录):

gdbtui bazel-bin/bin/main
Run Code Online (Sandbox Code Playgroud)

- >一切都很好,你应该看到你的C++源代码.

错误是做:

cd bazel-bin/bin/
gdbtui main
Run Code Online (Sandbox Code Playgroud)

在这种情况下,由于链接,gdb无法检索源代码.

来自Emacs的gdb调试:

像往常一样

M-x gdb 
Run Code Online (Sandbox Code Playgroud)

在emacs提示符中定义可执行文件的完整绝对路径:

gdb -i=mi /home/picaud/.../Cpp/bazel-bin/bin/main
Run Code Online (Sandbox Code Playgroud)

现在在gdb缓冲区中,您必须通过定义项目根目录的绝对路径(您的WORKSPACE文件所在的位置)来告诉gdb在哪里找到源:

set directories /home/picaud/.../Cpp
Run Code Online (Sandbox Code Playgroud)

现在emacs gdb命令应该可以正常工作,你可以照常调试.

(这是一个简单的修复,只是一个可能有帮助的说明...)

  • 我尝试了一些与此非常相似的方法,但是 gdb 找不到路径以“external/...”开头的文件。我最终从 `bazel-<dirname>` 开始(在这种情况下,它会是 `bazel-Cpp`)。在该目录中启动时,所有源路径似乎都是正确的。 (2认同)