Как собрать и отладить исполняемый файл C++ с помощью Bazel на Windows 10 x64
Я хочу отладить код на С ++, используя сгенерированный исполняемый файл с bazel, но по какой-то причине 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= никогда --compilation_mode=dbg
но когда я пытаюсь отладить приложение после установки точек останова, я получаю эту ошибку в консоли
например, если я бегу
gdb main.exe
затем
(GDB) сломать основной
я получил
Таблица символов не загружена.
Вопрос, как загрузить символы внутри main.exe при сборке кода с помощью команды bazel build??
1 ответ
Bazel в Windows по умолчанию создает код C++, используя MSVC. Я считаю, что формат данных отладки, используемый GCC, отличается от файлов MSVC.pdb, что объясняет, почему вы не можете использовать gdb
отладить двоичный файл, построенный Базелем.
Чтобы создать MingW GCC вместо MSVC по умолчанию, вы должны указать Bazel использовать этот компилятор:
bazel build -c dbg --compiler=mingw-gcc //src/app:main
Вот больше информации об этом --compiler
значение флага [1].
Сначала мне это не удалось, поэтому я следовал инструкциям /questions/20160464/kak-ustanovit-mingw-w64-i-msys2/20160465#20160465 и установил mingw-w64-x86_64-gcc
,
Теперь я мог бы построить //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++ toolchains. Я не знаю удобного способа сделать это (и я не хочу вдаваться в подробности о цепочках инструментов здесь), но все, что нам нужно знать, это:
Бежать
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, вы можете оставить его.)