我想使用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++工具链。我不知道有一种用户友好的方法可以做到这一点(我不想在这里详细介绍工具链(,但我们需要知道的是:
运行
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上的默认值,您可以将其排除在外。(