我想使用带bazel的生成的可执行文件调试c ++代码,但是由于某种原因,bazel不能在x64体系结构上构建代码,或者该可执行文件在调试模式下不起作用。
我的文件是
#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中加载符号?
答案 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 ++工具链。我不知道执行此操作的用户友好方式(并且我不想在此处讨论有关工具链的详细信息),但是我们需要知道的是:
运行bazel query @local_config_cc//:toolchain --output=build
。
这将打印C ++工具链规则的定义,这是一个自动生成的构建规则,告诉Bazel它可以使用哪些C ++工具链。
查看以toolchains = {...
开头的行。
这是一个字典,其中每个键定义一个--cpu
标志值或--cpu
和--compiler
标志值对。在这里无需详细介绍语法,您可能会看到带有键x64_windows|mingw-gcc
的条目,这意味着可以使用--cpu=x64_windows
和--compiler=mingw-gcc
进行构建。 (由于--cpu=x64_windows
是Windows的默认设置,因此您可以将其省略。)