使用gdb和bazel(以及emacs)进行C++调试

14

我想要调试使用Bazel生成的可执行文件。gdb调试器在Bazel生成的链接中丢失,并且无法显示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
1个回答

28

第一步是使用调试模式生成可执行文件:

bazel build ... --compilation_mode=dbg -s

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

从命令行进行gdb调试:

您可以使用命令(从项目根目录)开始gdb

gdbtui bazel-bin/bin/main

一切正常,您应该能看到您的C++源代码。

错误是:

cd bazel-bin/bin/
gdbtui main

因为链接的原因,gdb 无法检索源代码。

从 Emacs 进行 gdb 调试:

像往常一样操作。

M-x gdb 

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

gdb -i=mi /home/picaud/.../Cpp/bazel-bin/bin/main

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

set directories /home/picaud/.../Cpp

现在emacs gdb命令应该可以正常工作,您可以像往常一样进行调试。

(这是一个很容易的修复,只是可能会有所帮助的注释...)


3
我尝试过类似的事情,但是gdb找不到路径以external/...开头的文件。最终我从bazel-<dirname>(在这种情况下,应该是bazel-Cpp)开始。当从该目录开始时,所有源路径似乎都是正确的。 - Mark
那个评论是对问题的真正答案! - Dmitry
嗨,Picaud Vincent,您有任何配置可以在CLion IDE(版本2020.1.3,ubuntu)上使用Bazel插件调试Bazel项目吗?...提前感谢! - drstoop
1
@drstoop不好意思,我无法提供帮助:我从未使用过CLion IDE,也无法访问它。 - Picaud Vincent
@PicaudVincent,你是我飞翔的翅膀。非常感谢! - netskink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接