Передаю слово автору.
Относительно недавно я переехал на Linux. Разрабатывать на Windows, конечно, удобнее и приятнее, но и здесь я нашел эффективный способ легко и быстро отлаживать код на С/С++, не прибегая к таким методам как «printf-стайл отладки» и так далее.
Итак приступим. Писать в
sublime
(или gedit/kate/emacs
), а запускать в терминале — так себе решение, ошибку при работе с динамическим распределением памяти вряд ли найдёшь с первого раза. А если проект трудоёмкий? У меня есть более удобное решение. Да и ещё поддержка Git в редакторе, одни плюсы.Сегодня мы поговорим про Visual Studio Code.
Установка
Ubuntu/Debian
- Качаем версию пакета VS Code с расширением .deb
- Переходим в папку, куда скачался пакет (cd ~/Загрузки или cd ~/Downloads)
- Пишем, где (имя пакета).deb — название файла, который вы только что скачали:
sudo dpkg -i (имя пакета).deb sudo apt-get install -f
OpenSUSE/SLE Based distrs
- Установим репозиторий:
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'
- Обновим пакеты и установим 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»).
Важно:
- Для каждой папки вам нужно отдельно настроить файлы сборки и путь к программе.
- VS Code не решит ваших проблем, но поможет быстрее с ними разобраться. Причем в разы.
- После каждого изменения программы, ее нужно компилировать заново, нажимая Ctrl+Shift+B.
Полезные шорткаты можно посмотреть здесь.
Об авторе
Максимилиан Спиридонов — разработчик C#, студент МАИ, Microsoft Student Partner. В профессиональную разработку на .NET пришёл ещё в школе. Около года работал с реальными проектами на WPF(MVVM)+C#, MySQL, более 4-х лет разрабатывал на C#. Основная сфера интересов сейчас — это мобильная разработка на Xamarin. Также, по воле случая в сфере интересов оказались С/С++ и Linux.
Комментарии (56)
Dima_Sharihin
19.07.2017 11:38+4При наличии Qt Creator и Eclipse использовать VS Code для C++ как-то странно
maxspt
19.07.2017 12:44Текстовый редактор + плагин != IDE
gudvinr
19.07.2017 12:18Строчка, помеченная красной точкой слева — место, где остановится программа, при выполнении.
Не для слишком ли начинающих?
Тем не менее, в vscode есть хорошее расширения для CMake и, субъективно более удобный для автокомплита, чем дефолтное расширение, анализатор для Clang.
NeoCode
19.07.2017 12:24+3Меня вот как-то смущает среда разработки для С/С++, написанная на JavaScript :)
Хотя под Линукс особо выбора-то и нет (а до оригинальной Visual Studio всем другим очень далеко).
Qt Creator пожалуй лучшая, хотя и в ней есть масса недостатков.
CodeBlocks ничего так, но до сих пор нет поддержки Qt5.
Eclipse просто странная (пробовал ей под виндой собирать проекты для микроконтроллера, долго плевался — у них все не как у людей).maxspt
19.07.2017 12:40А то, что Sublime, например, написан на Pyhton не смущает?
Опять же вы некорректно сравниваете текстовый редактор(gedit, Atom) и IDE(QTCreator, Eclipse)NeoCode
19.07.2017 13:12+1Смущает, еще как. Меня даже IDE на Java, и те смущают:)
Из «текстовых редакторов с поддержкой программирования» лучшим под Линукс пожалуй будет Geany. Можно скомпилировать и запустить простенькую программу, ну и подсветка синтаксиса есть.maxspt
19.07.2017 13:20+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, я видел минимум один плагин, написанный таким образом.
apro
19.07.2017 12:56+1Хотя под Линукс особо выбора-то и нет
Вы перечислили две: Qt Creator + Eclipse,
еще CLion, KDevelop, https://netbeans.org/features/cpp/,
я лично использую emacs + rtags, так уж и нет выбора?
aaamodder
19.07.2017 12:24+1> Разрабатывать на Windows, конечно, удобнее и приятнее
CLion, Eclipse, Qt Creator, это всё отлично работает не только на винде.
Ничем не подкреплённое утверждение. Впрочем, чего я ожидал в этом блоге?maxspt
19.07.2017 12:35+1Не сравнимые вещи, IDE и Текстовый редактор.
Куда корректнее сравнивать VsCode и Sublime, например
QtRoS
20.07.2017 00:04+1Читайте «Разрабатывать на Windows, конечно, удобнее и приятнее» как «На linux нет Visual Studio».
Справедливости ради, с отладкой на линуксе и правда не все так приятно. Всегда вспоминается пример с Valve, когда они спросили, чем могут помочь linux сообществу. С большим перевесом победил «Улучшенный отладчик». На хабре было мельком https://habrahabr.ru/post/204836/
Filippok
19.07.2017 12:52+2Давайте начистоту, мало кто использует отладчик GDB на Linux в консольном варианте.
Многие используют. Очень многие.
Но что, если добавить в него красивый интерфейс?
soggoth
19.07.2017 13:09Здравствуйте, почему у меня при нажатии f5 приходит уведомление «Настроенный тип отладки „cppdbg“ не поддерживается.»? Что нужно сделать?
maxspt
19.07.2017 13:27Опишите подробнее, пожалуйста, на какой системе вы это проделывали.
И если не сложно приложите скрин кода launch.json
Возможно, вы что-то напутали с директивой отладки/сборкиsoggoth
19.07.2017 13:41На Windows 10.
Catharsis96
19.07.2017 13:50в данной статье описан способ отладки именно на Linux. Настройка с MSBuild несколько выходит за ее рамки. Но все же, если вы хотите отлаживать именно на Windows в VS Code, погуглите подключение MSBuild к VS Code.
maxspt
19.07.2017 13:501) Это статья для Linux
2) На Windows10 нет встроенного gcc
3) На Windows10 нет встроенного gdb
Вам нужно их поставить отдельно и прописать в переменные среды, но заработает ли, это большой вопрос.
Поищите информацию по использованию компилятора из VS-старшей и подготовки редактора именно для использования на Win10soggoth
19.07.2017 14:11А вы могли бы подсказать, каким примерно должен выглядеть launch.json для С++ на Windows?
vidyacat
19.07.2017 13:37И зачем нам на линуксе этот vs code? Кутикриэйтор есть, который лучше вашей студии и на винде-то.
maxspt
19.07.2017 13:38QtCreator — полноценная IDE,
А это текстовый редактор с плагинами
Вы путаете, видимо Visual Studio и Visual Studio Code…
Одна комбайн, другая редактор, не надо такvidyacat
21.07.2017 02:36IDE, а футпринт меньше чем у джаваподелия. Да у нас и редакторы с плагинами есть- вим тот же.
atap3d
19.07.2017 14:07Давайте начистоту, мало кто использует отладчик GDB на Linux в консольном варианте
Я например никого не знаю кто использует GDB не в консоле.Evgen52
19.07.2017 14:58+1Соглашусь. Более того, далеко не всегда (конечно, из моего личного опыта, не претендую на истину в последних инстанциях) есть возможность в принципе какой-то GUI запустить на Linux машине, где нужен gdb :) Чаще всего это какие-то сервера или встраиваемые системы, на которых консоль и только консоль, ибо большего не требуется) Иногда даже там сам gdb не помещался, только gdb-сервер, и приходилось отлаживать удаленно с другой машины.
arkamax
19.07.2017 20:10Я использовал Eclipse + GDB на Ubuntu при отладке user-space кода на внешней ARM-плате. Работа из консоли занимала бы существенно больше времени, и толковая привязка к IDE сэкономила бизнесу в сумме несколько недель, если не месяцев. Когда приходилось пилить модули ядра — дело другое, но даже там был вариант прикрутить к эклипсу KGDB — делать не стал, т.к. объем работ был существенно меньше.
soggoth
19.07.2017 14:42Какой раз уже пытаюсь разобраться с инструкцией на оф. сайте( https://code.visualstudio.com/docs/languages/cpp#_getting-started ), но никак не выходит
vitperov
19.07.2017 16:36+1Я использую отладчик GDB! Я!
А если серьёзно, то для отладки кода на встраиваемых системах это единственный способ (Beaglebone, Raspberry PI).
Идеально, конечно, иметь GUI отладчик, который позволил бы ещё отлаживать приложение по сети, запущенное на другой машине.
Но увы, пока о таком я не слышал.Dima_Sharihin
19.07.2017 16:51Qt Creator умеет заливать и отлаживать приложение на удаленной машине по SSH.
Главное, чтобы на удаленном хосте была поддержка SFTP.
На отлаживаемой машине запускается gdbserver, к которому подключается компьютер с IDE. Собственно я большую часть времени только так и работаю.
Этот способ также работает и для кросс-компиляции, главное правильно сконфигурировать тулчейн
vitperov
19.07.2017 17:04О! Спасибо! Кажется, это то, что я давно искал.
Спасибо, попробую.
Только не очень понял зачем нужен SFTP. Заливать я могу и сам по SSH.
arkamax
19.07.2017 20:13IIRC связка Eclipse / GDB, которую я настраивал в свое время для платы с Freescale Cortex, работала именно по сети (user-space код). Хотя интерфейс был чувствителен к стабильности сети, и когда я сдуру подцепил дефектный сетевой кабель, все превратилось в тыкву.
soggoth
19.07.2017 17:06Могли бы вы сделать такую статью, но только про Windows? Очень нужно, эта программа больше всего привлекает для программирования, поэтому на другую не хочется переходить.
quges1
19.07.2017 17:41Так на винде всё тоже самое. Только вот нужно ещё установить MinGW(порт gcc)
soggoth
19.07.2017 21:56После установки MinGw файлы .json должны быть такими же как и в статье?
maxspt
20.07.2017 00:55После установки компилятора, нужно будет добавить его путь в переменные среды Windows, чтобы вызывать его из любого места. Если вы это сделаете, то непосредственно компиляция проекта не будет отличаться
maxspt
20.07.2017 01:00Про переменные среды и MinGw вы можете посмотреть тут
https://maxspblogt.wordpress.com/2016/10/05/программирование-в-notepad/
Принцип по которому все будет работать, не сильно отличается:
1) Вы делаете доступным отовсюду компилятор
2) Подаёте ему на вход свой исходник
maxspt
19.07.2017 18:16Если интересно, то для Windows есть решение по-интереснее https://maxspblogt.wordpress.com/2017/04/27/готовим-pc-к-лабкам/
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. Воспроизводимость системы (важно при сборке в докере, например)
Tantrido
19.07.2017 20:26+2Разрабатывать на Windows, конечно, удобнее и приятнее,
Это с какого перепугу?!
Относительно недавно я переехал на Linux.
Вот с этого надо было начинать. Попробуй программирование и отладку в Qt Creator, Valgrind и т.п. и потом сравни с VS. В Linux-e гораздо удобнее и приятнее разработка.maxspt
20.07.2017 00:50Относительно недавно, это ~3 года назад
А на Windows удобнее, чисто имхо, да и интересно выслушать мнение других людей по этому поводу.
Например, я лично уже не один год каждодневно работаю в VS на C#. Но что насчёт QtCreator, он мне показался каким-то муторным, я больше к VS как-то привык. Valgrind — с ним не познакомился так близко, чтобы делать какие-то выводыDima_Sharihin
20.07.2017 07:46Ага, когда boost:: на Linux ставится одной строчкой в консоли, а в винде приходится выкачивать архив, который распакованным занимает 35 гигабайт места на диске и вручную прописывать пути в проекте до библиотеки.
QtCreator более простой, чем MSVS во всех смыслах — и по юзабилити, и по функционалу. К самой студии (если речь про полноценную MSVS2017) у меня претензий нет. Code — по большей части игрушка для хипстеров и проектов < 20-50 файлов.
Valgrind — с ним не познакомился так близко, чтобы делать какие-то выводы
Но именно благодаря ему я нашел несколько отвратительных трудновоспроизводимых (в т.ч. и в зависимости от архитектуры) багов в программе. Он, конечно, не спасет от кривой работы со структурами, но часто может спасти после часов разбора "да откуда же этот segmentation fault лезет"
Daniyar94
20.07.2017 03:03Хаха дайте ему пару лет. Через года так три, он сам будет смеяться над этим предложением :)
Tantrido
20.07.2017 04:13Например, я лично уже не один год каждодневно работаю в VS на C#.
Согласен, самому нравится.
Но что насчёт QtCreator, он мне показался каким-то муторным, я больше к VS как-то привык.
Я наоборот больше привык к QtCreator: поработаешь в нём больше — поймёшь, что навигация по коду в нём гораздо быстрее и удобнее, горячие клавиши гораздо понятнее и проще работают, и меньше нажимать нужно.
SparF
19.07.2017 23:14VS Code — прекрасен, мое основное средство для разработки MIPSfpga-plus. В одном редакторе одинаково удобно править Verilog, C и asm. Но когда, когда они наконец реализуют memory view???
https://github.com/Microsoft/vscode-cpptools/issues/509
VioletGiraffe
Спасибо, очень интересно. Не знал, что VS Code поддерживает С++.