使用 bazel 和 gdb 调试 C++ 应用程序
debug c++ application with bazel and gdb
我有点困惑。在使用 gdb 调试 bazel 构建的应用程序时,似乎有几种选择:
dazel 运行 --config=relwithdebinfo --run_under=gdb
达泽尔运行--compilation_mode=dbg--run_under=gdb
这让我进入了 gdb,但只有第二个选项似乎启用了真正的调试模式,因为整个应用程序 运行 速度较慢并且将调试信息写入终端,而第一个选项没有。
有人可以说明什么时候使用什么选项吗?
此外,bazel 似乎阻止我独立执行应用程序,即在通过
构建时使用 ./app
dazel build ...
而不是使用
达泽尔运行 ...
这是为什么?
一些可以帮助您弄清楚发生了什么的事情:
--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
--compilation_mode
与 --config
是分开的。 Bazel 中的编译器工具链可以定义不同的模式,以及用于这些模式的标志。参见 https://docs.bazel.build/versions/main/user-manual.html#flag--compilation_mode
使用默认的 C++ 工具链,当 --compilation_mode
为 dbg
时,它会添加 -g
:https://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)
对于 dazel build
与 dazel run
,问题可能是特定于应用程序的。例如,使用 run
,目标的 data
属性中的文件可用,而使用 build
它们不可用(因为资源打包是应用程序/语言/域特定的)。因此,应用程序可能会假设它是如何 运行 或它的依赖项在哪里。或者它可能是 dazel 特有的东西,我不太熟悉它。有了更多关于问题所在的信息,或许可以进一步诊断。
我有点困惑。在使用 gdb 调试 bazel 构建的应用程序时,似乎有几种选择:
dazel 运行 --config=relwithdebinfo --run_under=gdb
达泽尔运行--compilation_mode=dbg--run_under=gdb
这让我进入了 gdb,但只有第二个选项似乎启用了真正的调试模式,因为整个应用程序 运行 速度较慢并且将调试信息写入终端,而第一个选项没有。
有人可以说明什么时候使用什么选项吗?
此外,bazel 似乎阻止我独立执行应用程序,即在通过
构建时使用 ./appdazel build ...
而不是使用
达泽尔运行 ...
这是为什么?
一些可以帮助您弄清楚发生了什么的事情:
--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--compilation_mode
与--config
是分开的。 Bazel 中的编译器工具链可以定义不同的模式,以及用于这些模式的标志。参见 https://docs.bazel.build/versions/main/user-manual.html#flag--compilation_mode使用默认的 C++ 工具链,当
--compilation_mode
为dbg
时,它会添加-g
:https://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)对于
dazel build
与dazel run
,问题可能是特定于应用程序的。例如,使用run
,目标的data
属性中的文件可用,而使用build
它们不可用(因为资源打包是应用程序/语言/域特定的)。因此,应用程序可能会假设它是如何 运行 或它的依赖项在哪里。或者它可能是 dazel 特有的东西,我不太熟悉它。有了更多关于问题所在的信息,或许可以进一步诊断。