使用 bazel 和 gdb 调试 C++ 应用程序

debug c++ application with bazel and gdb

我有点困惑。在使用 gdb 调试 bazel 构建的应用程序时,似乎有几种选择:

  1. dazel 运行 --config=relwithdebinfo --run_under=gdb

  2. 达泽尔运行--compilation_mode=dbg--run_under=gdb

这让我进入了 gdb,但只有第二个选项似乎启用了真正的调试模式,因为整个应用程序 运行 速度较慢并且将调试信息写入终端,而第一个选项没有。

有人可以说明什么时候使用什么选项吗?

此外,bazel 似乎阻止我独立执行应用程序,即在通过

构建时使用 ./app

dazel build ...

而不是使用

达泽尔运行 ...

这是为什么?

一些可以帮助您弄清楚发生了什么的事情:

  1. --config 是一种以方便的方式使用其他 Bazel 命令行标志组的方法。这些组在 bazelrc 文件中定义。所以在一些 bazelrc 文件中有一个 relwithdebinfo 的定义,它添加了一些其他的标志。您可以使用 --announce_rc 让 Bazel 打印它正在使用的每个配置和 bazelrc。
    参见:
    https://docs.bazel.build/versions/main/user-manual.html#flag--config
    https://docs.bazel.build/versions/main/guide.html#bazelrc-the-bazel-configuration-file

  2. --compilation_mode--config 是分开的。 Bazel 中的编译器工具链可以定义不同的模式,以及用于这些模式的标志。参见 https://docs.bazel.build/versions/main/user-manual.html#flag--compilation_mode

    使用默认的 C++ 工具链,当 --compilation_modedbg 时,它会添加 -ghttps://github.com/bazelbuild/bazel/blob/b03bb844b10d5d0d29f5859293e91b5bd739c64f/tools/cpp/cc_toolchain_config.bzl#L659-L660

    当它是opt时,它会添加其他标志:https://github.com/bazelbuild/bazel/blob/b03bb844b10d5d0d29f5859293e91b5bd739c64f/tools/cpp/cc_toolchain_config.bzl#L675-L686

    可以使用 --cxxopt 手动添加 -g 等标志(甚至可以在 bazelrc 中创建 build:dbg --cxxopt=-g 等配置,然后在 Bazel 的命令行上执行 --config=dbg ) ,但它的便携性较差。 (例如,工具链还为 windows 定义了 --compilation_mode=dbg 的编译器标志:https://github.com/bazelbuild/bazel/blob/master/tools/cpp/cc_toolchain_config.bzl#L850-L855

  3. 对于 dazel builddazel run,问题可能是特定于应用程序的。例如,使用 run,目标的 data 属性中的文件可用,而使用 build 它们不可用(因为资源打包是应用程序/语言/域特定的)。因此,应用程序可能会假设它是如何 运行 或它的依赖项在哪里。或者它可能是 dazel 特有的东西,我不太熟悉它。有了更多关于问题所在的信息,或许可以进一步诊断。