Давайте начистоту, мало кто использует отладчик GDB на Linux в консольном варианте. Но что, если добавить в него красивый интерфейс? Под катом вы найдёте пошаговую инструкцию отладки кода С/С++ на Linux в Visual Studio Code.



Передаю слово автору.

Относительно недавно я переехал на Linux. Разрабатывать на Windows, конечно, удобнее и приятнее, но и здесь я нашел эффективный способ легко и быстро отлаживать код на С/С++, не прибегая к таким методам как «printf-стайл отладки» и так далее.

Итак приступим. Писать в sublime (или gedit/kate/emacs), а запускать в терминале — так себе решение, ошибку при работе с динамическим распределением памяти вряд ли найдёшь с первого раза. А если проект трудоёмкий? У меня есть более удобное решение. Да и ещё поддержка Git в редакторе, одни плюсы.

Сегодня мы поговорим про Visual Studio Code.

Установка


Ubuntu/Debian

  1. Качаем версию пакета VS Code с расширением .deb
  2. Переходим в папку, куда скачался пакет (cd ~/Загрузки или cd ~/Downloads)
  3. Пишем, где (имя пакета).deb — название файла, который вы только что скачали:

    sudo dpkg -i (имя пакета).deb
    	sudo apt-get install -f

OpenSUSE/SLE Based distrs

  1. Установим репозиторий:

    sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
    sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ntype=rpm-md\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/zypp/repos.d/VScode.repo'

  2. Обновим пакеты и установим VS Code:

    sudo zypper refresh
    sudo zypper install code

Расширения для С/С++


Чтобы VS Code полностью сопровождал нас при работе с файлами С/С++, нужно установить расширение «cpptools». Также полезным будет поставить один из наборов сниппетов.



Настоятельно рекомендую включить автосохранение редактируемых файлов, это поможет нам в дальнейшем.



Идём дальше. Открываем любую папку (новую или нет, неважно).



У меня в этой папке уже есть пара файлов для работы с C/C++. Вы можете скопировать одну из своих наработок сюда или создать новый файл.



Осталось всего ничего. Настроить компиляцию в одну клавишу и научиться отлаживать без printf.

Шаг 1. Открываем файл .c/.cpp, который (обязательно) лежит в вашей папке.

Шаг 2. Нажимаем Ctrl+Shift+B. VS Code вам мягко намекнет, что он не знает как собирать ваш проект.


Шаг 3. Поэтому дальше настраиваем задачу сборки: выбираем «Настроить задачу сборки» -> «Others».

Шаг 4. Прописываем конфигурацию в соответствии с образцом. По сути мы пишем скрипт для консоли, так что всем кто имел дело с ней будет понятно дальнейшее. Прошу заметить, что для сборки исходников в системе должен стоять сам компилятор (gcc или другой, отличаться будет только значение поля command). Поэтому для компиляции .cpp, понадобится в поле command указать g++ или c++, а для .c gcc.

Шаг 5. В args прописываем аргументы, которые будут переданы на вход вашему компилятору. Напоминаю, что порядок должен быть примерно таким: -g, <имя файла>.

Внимание: Если в вашей программе используется несколько файлов с исходным кодом, то укажите их в разных аргументах через запятую. Также обязательным является ключ -g(а лучше даже -g3). Иначе вы не сможете отладить программу.

Если в проекте для сборки вы используете makefile, то в поле command введите make, а в качестве аргумента передайте директиву для сборки.


Шаг 6. Далее возвращаемся обратно к нашему исходнику. И нажимаем F5 и выбираем C++.



Шаг 7. Осталось только написать путь к файлу программы. По умолчанию это ${workspaceRoot}/a.out, но я в своем файле сборки указал флаг -o и переименовал файл скомпилированной программы, поэтому у меня путь до программы: ${workspaceRoot}/main.


Шаг 8. Всё, больше нам не нужно ничего для начала использования всех благ VS Code. Переходим к основному проекту.

Отладка


Для начала скомпилируем программу (нет, нет, убери терминал, теперь это делается по нажатию Ctrl+Shift+B).



Как вы видите в проводнике появился main, значит все в порядке и сборка прошла без ошибок. У меня не слишком большая программа, но выполняется она моментально. Одним словом, провал чистой воды, потому что отладка идет в отдельном терминале, который закрывается после того, как программа дошла в main() до "return 0;".


Пришло время для брейкпоинтов. Выберем строчку с "return 0;" и нажимаем F9.


Строчка, помеченная красной точкой слева — место, где остановится программа, при выполнении.

Далее нажимаем F5.



Как я и сказал, программа остановила выполнение. Обратите внимание на окно с локальными переменными.



Удобненько. Также при остановке можно наводить мышкой на переменные и структуры в коде и смотреть их значения.


Также, если на каком-то этапе выполнения вам нужно посмотреть пошаговое выполнение той или иной операции, например в цикле, то поставьте брейкпоинт перед ней и нажмите F10 для выполнения текущей строчки без захода в подпрограмму и F11 с заходом.

Также есть случаи, когда считать выражение очень муторно вручную, но для отладки вам нужно знать, например, значение суммы трех элементов массива, или значение большого логического выражения. Для этого существуют контрольные значения. Все это и многое другое могут показать вам Контрольные значения (или «watch»).



Важно:

  1. Для каждой папки вам нужно отдельно настроить файлы сборки и путь к программе.
  2. VS Code не решит ваших проблем, но поможет быстрее с ними разобраться. Причем в разы.
  3. После каждого изменения программы, ее нужно компилировать заново, нажимая Ctrl+Shift+B.

Полезные шорткаты можно посмотреть здесь.

Об авторе



Максимилиан Спиридонов — разработчик C#, студент МАИ, Microsoft Student Partner. В профессиональную разработку на .NET пришёл ещё в школе. Около года работал с реальными проектами на WPF(MVVM)+C#, MySQL, более 4-х лет разрабатывал на C#. Основная сфера интересов сейчас — это мобильная разработка на Xamarin. Также, по воле случая в сфере интересов оказались С/С++ и Linux.
Поделиться с друзьями
-->

Комментарии (56)


  1. VioletGiraffe
    19.07.2017 10:59

    Спасибо, очень интересно. Не знал, что VS Code поддерживает С++.


  1. Dima_Sharihin
    19.07.2017 11:38
    +4

    При наличии Qt Creator и Eclipse использовать VS Code для C++ как-то странно


    1. maxspt
      19.07.2017 12:44

      Текстовый редактор + плагин != IDE


      1. PavelZhigulin
        19.07.2017 14:44

        Эта штука почти такая же тормозная, как IDE)


        1. maxspt
          19.07.2017 15:08

          Хе-хе) Тут не соглашусь))


  1. awoland
    19.07.2017 11:51
    +1

    Регистр имеет значение (а в linux особенно)!
    https://packages.microsoft.com/yumrepos/VScode => 404 Not Found
    Правильный адрес: https://packages.microsoft.com/yumrepos/vscode


    1. Schvepsss
      19.07.2017 12:07

      Спасибо, исправили.


  1. gudvinr
    19.07.2017 12:18

    Строчка, помеченная красной точкой слева — место, где остановится программа, при выполнении.

    Не для слишком ли начинающих?


    Тем не менее, в vscode есть хорошее расширения для CMake и, субъективно более удобный для автокомплита, чем дефолтное расширение, анализатор для Clang.


  1. NeoCode
    19.07.2017 12:24
    +3

    Меня вот как-то смущает среда разработки для С/С++, написанная на JavaScript :)
    Хотя под Линукс особо выбора-то и нет (а до оригинальной Visual Studio всем другим очень далеко).
    Qt Creator пожалуй лучшая, хотя и в ней есть масса недостатков.
    CodeBlocks ничего так, но до сих пор нет поддержки Qt5.
    Eclipse просто странная (пробовал ей под виндой собирать проекты для микроконтроллера, долго плевался — у них все не как у людей).


    1. maxspt
      19.07.2017 12:40

      А то, что Sublime, например, написан на Pyhton не смущает?
      Опять же вы некорректно сравниваете текстовый редактор(gedit, Atom) и IDE(QTCreator, Eclipse)


      1. NeoCode
        19.07.2017 13:12
        +1

        Смущает, еще как. Меня даже IDE на Java, и те смущают:)
        Из «текстовых редакторов с поддержкой программирования» лучшим под Линукс пожалуй будет Geany. Можно скомпилировать и запустить простенькую программу, ну и подсветка синтаксиса есть.


        1. maxspt
          19.07.2017 13:20
          +1

          Тут у каждого свои предпочтения. Лучшего редактора априори быть не может, т.к. большинство имеют схожий функционал.
          Кому что ближе, то и используют, на самом деле


      1. eugenebabichenko
        19.07.2017 15:04
        +3

        @cwgem Sublime Text 2 is written in C++, with some Objective C for Cocoa integration, and Python for plugins

        Ссылка
        Python там только в плагинах, и то никто не запрещал писать компоненты на C++ и связывать их с Python, я видел минимум один плагин, написанный таким образом.


    1. apro
      19.07.2017 12:56
      +1

      Хотя под Линукс особо выбора-то и нет

      Вы перечислили две: Qt Creator + Eclipse,


      еще CLion, KDevelop, https://netbeans.org/features/cpp/,


      я лично использую emacs + rtags, так уж и нет выбора?


  1. aaamodder
    19.07.2017 12:24
    +1

    > Разрабатывать на Windows, конечно, удобнее и приятнее

    CLion, Eclipse, Qt Creator, это всё отлично работает не только на винде.

    Ничем не подкреплённое утверждение. Впрочем, чего я ожидал в этом блоге?


    1. maxspt
      19.07.2017 12:35
      +1

      Не сравнимые вещи, IDE и Текстовый редактор.
      Куда корректнее сравнивать VsCode и Sublime, например


    1. QtRoS
      20.07.2017 00:04
      +1

      Читайте «Разрабатывать на Windows, конечно, удобнее и приятнее» как «На linux нет Visual Studio».

      Справедливости ради, с отладкой на линуксе и правда не все так приятно. Всегда вспоминается пример с Valve, когда они спросили, чем могут помочь linux сообществу. С большим перевесом победил «Улучшенный отладчик». На хабре было мельком https://habrahabr.ru/post/204836/


  1. Filippok
    19.07.2017 12:52
    +2

    Давайте начистоту, мало кто использует отладчик GDB на Linux в консольном варианте.

    Многие используют. Очень многие.


    Но что, если добавить в него красивый интерфейс?

    https://github.com/cyrus-and/gdb-dashboard


  1. soggoth
    19.07.2017 13:09

    Здравствуйте, почему у меня при нажатии f5 приходит уведомление «Настроенный тип отладки „cppdbg“ не поддерживается.»? Что нужно сделать?


    1. maxspt
      19.07.2017 13:27

      Опишите подробнее, пожалуйста, на какой системе вы это проделывали.
      И если не сложно приложите скрин кода launch.json

      Возможно, вы что-то напутали с директивой отладки/сборки


      1. soggoth
        19.07.2017 13:41

        На Windows 10.
        image


        1. Catharsis96
          19.07.2017 13:50

          в данной статье описан способ отладки именно на Linux. Настройка с MSBuild несколько выходит за ее рамки. Но все же, если вы хотите отлаживать именно на Windows в VS Code, погуглите подключение MSBuild к VS Code.


        1. maxspt
          19.07.2017 13:50

          1) Это статья для Linux
          2) На Windows10 нет встроенного gcc
          3) На Windows10 нет встроенного gdb
          Вам нужно их поставить отдельно и прописать в переменные среды, но заработает ли, это большой вопрос.
          Поищите информацию по использованию компилятора из VS-старшей и подготовки редактора именно для использования на Win10


          1. soggoth
            19.07.2017 13:57

            Хорошо, спасибо


          1. soggoth
            19.07.2017 14:11

            А вы могли бы подсказать, каким примерно должен выглядеть launch.json для С++ на Windows?


            1. Catharsis96
              19.07.2017 15:40

              Примерно вот таким: http://pastebin.com/imM1cz8u
              Но я делал с MinGW.


              1. soggoth
                19.07.2017 16:36

                Я новичок в этом. Поэтому и сложно разобраться. Думал у Microsoft спросить в онлайн чате, а они убрали эту функцию.


                1. Schvepsss
                  19.07.2017 17:49

                  Минутка рекламы. У нас есть официальный чат в Telegram от сообщества Microsoft Developer. Можно спросить там.


      1. soggoth
        19.07.2017 13:46

        На Windows 10.
        http://imgur.com/tCHgRlf


  1. vidyacat
    19.07.2017 13:37

    И зачем нам на линуксе этот vs code? Кутикриэйтор есть, который лучше вашей студии и на винде-то.


    1. maxspt
      19.07.2017 13:38

      QtCreator — полноценная IDE,
      А это текстовый редактор с плагинами
      Вы путаете, видимо Visual Studio и Visual Studio Code…
      Одна комбайн, другая редактор, не надо так


      1. vidyacat
        21.07.2017 02:36

        IDE, а футпринт меньше чем у джаваподелия. Да у нас и редакторы с плагинами есть- вим тот же.


  1. atap3d
    19.07.2017 14:07

    Давайте начистоту, мало кто использует отладчик GDB на Linux в консольном варианте

    Я например никого не знаю кто использует GDB не в консоле.


    1. Evgen52
      19.07.2017 14:58
      +1

      Соглашусь. Более того, далеко не всегда (конечно, из моего личного опыта, не претендую на истину в последних инстанциях) есть возможность в принципе какой-то GUI запустить на Linux машине, где нужен gdb :) Чаще всего это какие-то сервера или встраиваемые системы, на которых консоль и только консоль, ибо большего не требуется) Иногда даже там сам gdb не помещался, только gdb-сервер, и приходилось отлаживать удаленно с другой машины.


      1. maxspt
        19.07.2017 15:27
        +1

        Статья же не для такого случая, когда есть только православная консоль.


    1. arkamax
      19.07.2017 20:10

      Я использовал Eclipse + GDB на Ubuntu при отладке user-space кода на внешней ARM-плате. Работа из консоли занимала бы существенно больше времени, и толковая привязка к IDE сэкономила бизнесу в сумме несколько недель, если не месяцев. Когда приходилось пилить модули ядра — дело другое, но даже там был вариант прикрутить к эклипсу KGDB — делать не стал, т.к. объем работ был существенно меньше.


    1. awoland
      20.07.2017 15:30

      Зачем в консоли? Для gdb есть Мотиф'овский DDD…


  1. soggoth
    19.07.2017 14:42

    Какой раз уже пытаюсь разобраться с инструкцией на оф. сайте( https://code.visualstudio.com/docs/languages/cpp#_getting-started ), но никак не выходит


  1. vitperov
    19.07.2017 16:36
    +1

    Я использую отладчик GDB! Я!

    А если серьёзно, то для отладки кода на встраиваемых системах это единственный способ (Beaglebone, Raspberry PI).
    Идеально, конечно, иметь GUI отладчик, который позволил бы ещё отлаживать приложение по сети, запущенное на другой машине.
    Но увы, пока о таком я не слышал.


    1. Dima_Sharihin
      19.07.2017 16:51

      Qt Creator умеет заливать и отлаживать приложение на удаленной машине по SSH.
      Главное, чтобы на удаленном хосте была поддержка SFTP.


      На отлаживаемой машине запускается gdbserver, к которому подключается компьютер с IDE. Собственно я большую часть времени только так и работаю.


      Этот способ также работает и для кросс-компиляции, главное правильно сконфигурировать тулчейн


      1. vitperov
        19.07.2017 17:04

        О! Спасибо! Кажется, это то, что я давно искал.

        Спасибо, попробую.

        Только не очень понял зачем нужен SFTP. Заливать я могу и сам по SSH.


    1. arkamax
      19.07.2017 20:13

      IIRC связка Eclipse / GDB, которую я настраивал в свое время для платы с Freescale Cortex, работала именно по сети (user-space код). Хотя интерфейс был чувствителен к стабильности сети, и когда я сдуру подцепил дефектный сетевой кабель, все превратилось в тыкву.


  1. soggoth
    19.07.2017 17:06

    Могли бы вы сделать такую статью, но только про Windows? Очень нужно, эта программа больше всего привлекает для программирования, поэтому на другую не хочется переходить.


    1. quges1
      19.07.2017 17:41

      Так на винде всё тоже самое. Только вот нужно ещё установить MinGW(порт gcc)


      1. soggoth
        19.07.2017 21:56

        После установки MinGw файлы .json должны быть такими же как и в статье?


        1. maxspt
          20.07.2017 00:55

          После установки компилятора, нужно будет добавить его путь в переменные среды Windows, чтобы вызывать его из любого места. Если вы это сделаете, то непосредственно компиляция проекта не будет отличаться


        1. maxspt
          20.07.2017 01:00

          Про переменные среды и MinGw вы можете посмотреть тут
          https://maxspblogt.wordpress.com/2016/10/05/программирование-в-notepad/
          Принцип по которому все будет работать, не сильно отличается:
          1) Вы делаете доступным отовсюду компилятор
          2) Подаёте ему на вход свой исходник


    1. maxspt
      19.07.2017 18:16

      Если интересно, то для Windows есть решение по-интереснее https://maxspblogt.wordpress.com/2017/04/27/готовим-pc-к-лабкам/


  1. Antervis
    19.07.2017 18:16

    уже несколько лет пишу параллельно под win/linux. В подавляющем большинстве случаев мне удобнее разрабатывать на linux, потому что:
    1. apt install очень удобная штука. Раскидает все утилиты/библиотеки/заголовочные файлы по необходимым путям (не надо будет прописывать эти пути в процессе конфигурации проекта)
    2. update-alternatives: system-wide переключение между комплектами сборки однострочником.
    3. поддержка стандартов с++ в msvc уступает таковой в gcc/clang
    4. нативный API windows ужасен. Скажем, чтобы создать ярлык, нужно около 20 строк кода, в котором пару раз придется обойти ошибку «попытка передать const char * в функцию, принимающую char *» (которая не меняет строку).
    5. Куча специфичных мелочей типа симлинков, RPATH, правил линковки, множества стандартных консольных утилит и пр.
    6. Воспроизводимость системы (важно при сборке в докере, например)


  1. Tantrido
    19.07.2017 20:26
    +2

    Разрабатывать на Windows, конечно, удобнее и приятнее,
    Это с какого перепугу?!

    Относительно недавно я переехал на Linux.
    Вот с этого надо было начинать. Попробуй программирование и отладку в Qt Creator, Valgrind и т.п. и потом сравни с VS. В Linux-e гораздо удобнее и приятнее разработка.


    1. maxspt
      20.07.2017 00:50

      Относительно недавно, это ~3 года назад
      А на Windows удобнее, чисто имхо, да и интересно выслушать мнение других людей по этому поводу.
      Например, я лично уже не один год каждодневно работаю в VS на C#. Но что насчёт QtCreator, он мне показался каким-то муторным, я больше к VS как-то привык. Valgrind — с ним не познакомился так близко, чтобы делать какие-то выводы


      1. Dima_Sharihin
        20.07.2017 07:46

        Ага, когда boost:: на Linux ставится одной строчкой в консоли, а в винде приходится выкачивать архив, который распакованным занимает 35 гигабайт места на диске и вручную прописывать пути в проекте до библиотеки.


        QtCreator более простой, чем MSVS во всех смыслах — и по юзабилити, и по функционалу. К самой студии (если речь про полноценную MSVS2017) у меня претензий нет. Code — по большей части игрушка для хипстеров и проектов < 20-50 файлов.


        Valgrind — с ним не познакомился так близко, чтобы делать какие-то выводы

        Но именно благодаря ему я нашел несколько отвратительных трудновоспроизводимых (в т.ч. и в зависимости от архитектуры) багов в программе. Он, конечно, не спасет от кривой работы со структурами, но часто может спасти после часов разбора "да откуда же этот segmentation fault лезет"


    1. Daniyar94
      20.07.2017 03:03

      Хаха дайте ему пару лет. Через года так три, он сам будет смеяться над этим предложением :)


      1. Tantrido
        20.07.2017 04:13

        Например, я лично уже не один год каждодневно работаю в VS на C#.
        Согласен, самому нравится.

        Но что насчёт QtCreator, он мне показался каким-то муторным, я больше к VS как-то привык.
        Я наоборот больше привык к QtCreator: поработаешь в нём больше — поймёшь, что навигация по коду в нём гораздо быстрее и удобнее, горячие клавиши гораздо понятнее и проще работают, и меньше нажимать нужно.


  1. SparF
    19.07.2017 23:14

    VS Code — прекрасен, мое основное средство для разработки MIPSfpga-plus. В одном редакторе одинаково удобно править Verilog, C и asm. Но когда, когда они наконец реализуют memory view???
    https://github.com/Microsoft/vscode-cpptools/issues/509


    1. maxspt
      20.07.2017 00:52

      Тоже жду этой фичи, но пока что-то они не сильно торопятся