Как отлаживать код на С ++ с помощью Bazel в ОС Windows 10

Недавно я начал играть с Bazel и столкнулся с проблемой отладки приложения, я могу отладить с помощью g++, но не могу отладить сгенерированный Bazel файл.exe.

Спасибо, что посмотрели на это.

Кроме того, я создаю исходный код с помощью задач Bazel и VsCode.

  1. Какой файл.exe я должен выбрать для отладки моего приложения?
  2. Все в порядке?
  3. Можно отладить исходный код на C++, используя Bazel в Windows.
  4. Должен ли я использовать minGW для отладки исполняемого bazel исполняемого файла или некоторых других инструментов или отладчиков?

Версии

  • ОС: Windows 10
  • Базель версия: метка сборки: 0.20.0

У меня есть такая структура проекта:

|-- CPP_TESTS
    |-- .gitignore
    |-- a.exe  <-- I generated this with g++ minGW
    |-- readme.md
    |-- WORKSPACE
    |-- .vscode
    |   |-- c_cpp_properties.json
    |   |-- launch.json
    |   |-- settings.json
    |   |-- tasks.json
    |-- project
        |-- WORKSPACE
        |-- main
            |-- app.cc
            |-- BUILD
            |-- readme.md

app.cc

#include <iostream>

int main(int argc, char const *argv[])
{
    int a = 3;
    int b = 5;
    int c = a + b;

    /* code */
    std::cout << "Hello world" << std::endl;
    std::cout << c << std::endl;
    return 0;
}

Файл BUILD

cc_binary(
    name = "app",
    srcs = ["app.cc"]
)

А затем я запускаю эту команду в корне./CPP_TESTS

bazel build //project/main:app

эта команда сгенерирует некоторые файлы и папки

Некоторые из папок содержат файл app.exe, например, внутри директории bazel-bin. У меня есть эти файлы и папка.

|-- bazel-bin
    |-- project
    |   |-- main
    |       |-- app.exe
    |       |-- app.exe-2.params
    |       |-- app.exe.runfiles_manifest
    |       |-- app.pdb
    |       |-- app.exe.runfiles
    |       |   |-- MANIFEST
    |       |-- _objs
    |           |-- app
    |               |-- app.obj
    |-- project-name
        |-- main
            |-- app.exe
            |-- app.exe-2.params
            |-- app.exe.runfiles_manifest
            |-- app.pdb
            |-- app.exe.runfiles
            |   |-- MANIFEST
            |-- _objs
                |-- app
                    |-- app.obj

так что, если я запускаю app.exe внутри

|-- bazel-bin
    |-- project
    |   |-- main
    |       |-- app.exe   <=========

Я получаю этот вывод

INFO: Elapsed time: 0,145s, Critical Path: 0,01s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action
INFO: Build completed successfully, 1 total action
Hello world
8
PS C:\dev\tests\cpp_tests>

если я отлаживаю приложение, я получаю эту ошибку.

прежде чем начать это мои задачи / JSON

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "bazel_run",
            "type": "shell",
            "command": "bazel run //project/main:app",
            "args": [],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "bazel_build",
            "type": "shell",
            "command": "bazel build //project/main:app",
            "args": [],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "bazel_debug_build",
            "type": "shell",
            "command": "bazel",
            "args": [
                "build",
                "//project/main:app",
                "--compilation_mode=dbg"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": [
                "$gcc"
            ]
        }
    ]
}

launch.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {                                
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            // "program": "${workspaceFolder}/a.exe",
            "program": "${workspaceFolder}\\bazel-bin\\project\\main\\app.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "miDebuggerPath": "C:/MinGW/bin/gdb.exe",
            "preLaunchTask": "bazel_debug_build",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

Так что я бегу bazel build //project/main:app команда

Сообщение об ошибке.

Но есть ли app.exe?

1 ответ

Вы должны использовать исполняемый файл, расположенный в папке сборки bazel-out/x64_windows-dbg/project/main/app.exe.

Если вы устанавливаете точки останова, вам может понадобиться --strip=never аргумент.

Если это не сработает, попробуйте использовать "cppvsdbg" вместо "cppdbg" в качестве типа конфигурации в вашем launch.json.

Во-первых, вам нужно добавить некоторые параметры базеля для отладки. Руководство находится здесь:введите описание ссылки здесь

Если вы хотите отладить свою программу, вам понадобятся и такие параметры, как:

bazel build --copt="-g" --strip="never" ... 

Пожалуйста, смотрите мой ответ на соответствующий вопрос: /questions/4943707/kak-sobrat-i-otladit-ispolnyaemyij-fajl-c-s-pomoschyu-bazel-na-windows-10-x64/4943722#4943722

Хотя я не могу сказать, правильны ли ваши настройки (мне нужно знать больше, например, какие плагины VSCode вы установили, каков контент других файлов.json), я могу точно сказать, что он выглядит неправильно, что у вас есть два WORKSPACE файлы.

Вы должны удалить project\WORKSPACEпотому что Базель считает каждое дерево каталогов с WORKSPACE файл должен быть уникальным рабочим пространством. Каждое рабочее пространство нуждается только в одном файле WORKSPACE в своем корневом каталоге. Если у подкаталога есть собственный файл WORKSPACE, то это отдельное рабочее пространство, и Bazel не будет использовать цели из него в "родительском" рабочем пространстве.

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