Как собрать и отладить исполняемый файл 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. Я не знаю удобного способа сделать это (и я не хочу вдаваться в подробности о цепочках инструментов здесь), но все, что нам нужно знать, это:

  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, вы можете оставить его.)

Другие вопросы по тегам