Отладка кода на C ++ с помощью Visual Studio Code Ubuntu - PullRequest
0 голосов
/ 08 ноября 2019

Добрый вечер всем, я пытаюсь отладить эту маленькую программу в Visual Studio, код в Ubuntu:

#include <string>
#include <iostream>

int main(int argc, char* argv[]) 
{
  std::string folder = argv[1];
}

, но отладка завершается с этой ошибкой в ​​терминале:

"прекращаетсявызывается после создания экземпляра 'std :: logic_error' what (): basic_string :: _ M_construct null not valid "

и это в консоли отладки:

" Невозможно открыть "повышение. c ': невозможно прочитать файл (ошибка: файл не найден (/build/glibc-4WA41p/glibc-2.30/sysdeps/unix/sysv/linux/raise.c))."

Итак, вопрос:

1) Можно ли отобразить номер строки, где произошла ошибка? (В данном случае строка 6)

2) Почему возникает эта ошибка и как ее избежать?

3) Чтобы избежать этой проблемы, я могу написать, например:

string folder = "/home/lorenzo/Images";

но я не хочу этого делать. Для «запуска» программы из терминала я пишу ./main / home / lorenzo / Images, поэтому передаю папку в программу таким образом. Можно ли сделать то же самое при отладке, без записи папки непосредственно в программе или использования cin?

Заранее спасибо!

1 Ответ

0 голосов
/ 08 ноября 2019

Если вы хотите выполнить отладку с помощью VS Code, есть настройка, которую вы должны выполнить для каждого проекта, но после ее завершения все просто.

Установите gdb, если вы еще этого не сделали. Затем вам нужно выбрать конфигурацию на панели отладки. Инструкции можно найти здесь . Скомпилируйте вашу программу с -g как минимум. Я предпочитаю также добавить в -O0, чтобы минимизировать оптимизации.

Как только вы настроитесь, вы готовы к отладке с VS Code. Теперь, чтобы [надеюсь] ответить на ваши вопросы.

  1. GDB может сделать это для некоторых ошибок сегментации;Как правило, вы хотите научиться самостоятельно перемещаться по коду.
  2. Я попытался скомпилировать и запустить вашу программу, и она работала просто отлично. Имя вашего исполняемого файла main? Я скомпилировал на Debian, используя gcc 5.5. Я не назвал свой исполняемый файл, поэтому мой вызов выглядел так:
    ./a.out /home/sweenish/tmp. Так как мой не подвел, я не могу предложить большую помощь здесь. Но ваш компилятор говорит, что файл не существует. Вы установили пакет build-essential?
  3. Да, вы можете автоматизировать дополнительный аргумент, добавив опцию в файл launch.json для проекта VS Code.

Вот краткий пример:

#include <string>
#include <iostream>

int main(int argc, char* argv[]) 
{
  std::string folder = argv[1];
  std::cout << folder << '\n';  // Set a breakpoint here
}

Я добавил дополнительную строку кода в ваш пример. Установите точку останова, щелкнув слева от номера строки, появится красный кружок.

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558 
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "g++ build active file",
            "command": "g++",
            "args": [
                "-Wall",
                "-std=c++17",
                "-g",
                "-O0",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "/home/linuxbrew/.linuxbrew/bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build"
        }
    ]
}

Это слегка измененная автоматически созданная задача. Я добавил -Wall, -std=c++17 и -O0. Это файл tasks.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": "g++ build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [
                "/home/lorenzo/Images"
            ],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "g++ build active file",
            "miDebuggerPath": "gdb"
        }
    ]
}

Это автоматически сгенерированный launch.json. Обратите внимание, что я добавил аргумент пути. Отладчик всегда будет вызывать с этим аргументом, сохраняя при этом некоторую печать.

Затем я нажимаю кнопку «Воспроизвести» на панели отладки, когда мой файл C ++ активен, и он скомпилирует и запустит отладчик для меня. В консоли отладки команда: -exec print argv[1] печатает путь к файлу, который я использую в качестве аргумента программы.

...