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

时间:2018-12-18 20:58:57

标签: c++ mingw bazel

我想使用带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中加载符号?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

这首先对我来说失败了,所以我遵循https://stackoverflow.com/a/30071634/7778502的说明并安装了mingw-w64-x86_64-gcc

现在,我可以使用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的默认设置,因此您可以将其省略。)