如何在windows 10 x64上使用Bazel构建和调试c++可执行文件



我想使用bazel生成的可执行文件调试c++代码,但由于某些原因,bazel没有在x64架构上构建代码,或者可执行文件无法在调试模式下工作。

我的文件是

main.cpp

#include <iostream>
int main()
{
int a = 3;
int b = 5;
int c = a + b;
/* code */
std::cout << "Hello world" << std::endl;
return 0;
}

我使用此命令来构建我的应用

bazel build//src/app:main--strip=never--compilation_mode=dbg

但当我在设置断点后尝试调试应用程序时,我在控制台中收到了这个错误

例如,如果我运行

gdb main.exe

然后

(gdb(中断主

我得到

未加载任何符号表。

当我使用bazel-build命令构建代码时,如何加载main.exe中的符号??

Bazel在Windows上默认使用MSVC构建C++代码。我认为GCC使用的调试数据格式与MSVC的.pdb文件不同,这可以解释为什么不能使用gdb来调试Bazel构建的二进制文件。

要使用MingWGCC而不是默认的MSVC进行构建,您必须告诉Bazel使用该编译器:

bazel build -c dbg --compiler=mingw-gcc //src/app:main

以下是有关此--compiler标志值[1]的更多信息。

这首先对我来说失败了,所以我遵循了https://stackoverflow.com/a/30071634/7778502并安装了CCD_ 4。

现在我可以用Bazel构建//src/app:main,并使用gdb设置断点:

$ gdb /c/src/so53840959/CPP_TESTS/project/bazel-bin/main/app.exe
GNU gdb (GDB) 7.11.1
...
Traceback (most recent call last):
File "<string>", line 3, in <module>
ImportError: No module named libstdcxx.v6.printers
/etc/gdbinit:6: Error in sourced command file:
Error while executing Python code.
Reading symbols from /c/src/so53840959/CPP_TESTS/project/bazel-bin/main/app.exe...done.
(gdb) break main
Breakpoint 1 at 0x401568
(gdb)

我不熟悉gdb,但错误看起来很好,一切看起来都很好。


[1]为了找到这个--compiler标志值,我查看了注册的C++工具链。我不知道有一种用户友好的方法可以做到这一点(我不想在这里详细介绍工具链(,但我们需要知道的是:

  1. 运行bazel query @local_config_cc//:toolchain --output=build

    这将打印C++工具链规则的定义,这是一个自动生成的构建规则,告诉Bazel它可以使用什么C++工具链。

  2. 看以toolchains = {...开头的行。

    它是一个字典,其中每个键定义一个--cpu标志值,或--cpu--compiler标志值对。在不详细介绍语法的情况下,您可能会看到一个关键字为x64_windows|mingw-gcc的条目,这意味着您可以使用--cpu=x64_windows--compiler=mingw-gcc进行构建。(由于--cpu=x64_windows是Windows上的默认值,您可以将其排除在外。(

最新更新