我想使用生成的带有 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;
}
Run Code Online (Sandbox Code Playgroud)
我使用这个命令来构建我的应用程序
bazel build //src/app:main --strip=never --compilation_mode=dbg
但是当我在设置断点后尝试调试应用程序时,我在控制台中收到此错误
例如,如果我跑
gdb main.exe
然后
(gdb) 中断主要
我得到
没有加载符号表。
当我使用bazel build 命令构建代码时,如何在 main.exe 中加载符号?
默认情况下,Windows 上的 Bazel 使用 MSVC 构建 C++ 代码。我认为 GCC 使用的调试数据格式与 MSVC 的 .pdb 文件不同,这可以解释为什么不能用于gdb调试 Bazel 构建的二进制文件。
要使用 MingW GCC 而不是默认的 MSVC 进行构建,您必须告诉 Bazel 使用该编译器:
bazel build -c dbg --compiler=mingw-gcc //src/app:main
Run Code Online (Sandbox Code Playgroud)
这是有关此--compiler标志值的更多信息[1]。
这首先对我来说失败了,所以我按照/sf/answers/2105014411/ 的说明安装了mingw-w64-x86_64-gcc.
现在我可以//src/app:main用 Bazel构建,并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)
Run Code Online (Sandbox Code Playgroud)
我不熟悉,gdb但错误看起来是良性的,一切看起来都很好。
[1] 为了找到这个--compiler标志值,我查看了注册的 C++ 工具链。我不知道有一种用户友好的方式来做到这一点(我不想在这里详细介绍工具链),但我们需要知道的是:
运行bazel query @local_config_cc//:toolchain --output=build。
这将打印 C++ 工具链规则的定义,这是一个自动生成的构建规则,告诉 Bazel 它可以使用哪些 C++ 工具链。
查看以 开头的行toolchains = {...。
它是一个字典,其中每个键定义一个--cpu标志值,或一个--cpu和--compiler标志值对。此处无需详细介绍语法,您可能会看到带有 key 的条目x64_windows|mingw-gcc,这意味着您可以使用--cpu=x64_windowsand进行构建--compiler=mingw-gcc。(由于--cpu=x64_windows是 Windows 上的默认设置,您可以将其省略。)