Приветствую, С/С++ разработчики, те, кто только изучает эти языки и просто интересующиеся! В этом посте речь пойдет об отладочном расширении Stack Scopes для Visual Studio Code.

Отладка важная часть разработки, но нужно признать, что не очень любимая большинством разработчиков. Прежде всего из-за рутинности, необходимости глубокого погружения в контекст зачастую знакомый только отчасти и часто неочевидности причин отлаживаемой проблемы. Так же критично обладать хорошими низкоуровневыми познаниями, владеть разнообразными низкоуровневыми же инструментами отладки и диагностики. Такими навыками, как правило, обладают опытные сеньоры или олдскульные гики, не признающие ничего кроме инструментов командной оболочки. Такие спецы разумеется нарасхват и всегда заняты, так что зачастую "соскочить" с отладки внезапной трудно локализуемой проблемы никак нельзя. И хорошо, если проблему вскрыли в QA, а не на боевом сервере клиента, имеется стенд и можно спокойно работать. Отлаживать небольшие приложения в пару-тройку потоков, еще и написанные и поддерживаемые лично вами легко. Совсем другое дело большие приложения с множеством модулей, легаси, десятками потоков, когда все это написано разными людьми, многие из которых уже давно уволились.

С некоторых пор в своей работе я использую в Visual Studio Code. Это прекрасная, настраиваемая, расширяемая IDE, с открытым исходным кодом и в рекламе не нуждается. Однако стандартное расширение C/C++ довольно минималистичное в отладочной части, что несколько дискомфортно когда возникает необходимость отладки Linux приложений, особенно по части анализа дампов. Поиск по дереву стеков довольно затруднителен на емких дампах, необходимость переключать текущий фрейм для просмотра контекста не очень удобна при анализе состояний. Не хватает возможности одновременного просмотра контекстов отдельных фреймов, графического представления стеков, поиска по стекам, возможности подсвечивать разделяемые контексты, работать с отдельными потоками и т.п. Под Windows классический Visual Studio C++ покрывает потребности своим разнообразным интерактивным инструментарием. В nix системах доминируют консервативные порядки. Прекрасных инструментов множество, но большинство низкоуровневые. Понятно, что их освоение совершенно необходимо. Однако время самый дефицитный ресурс и отказывать себе в упрощении рутинных задач за счет интерактивных инструментов неразумно. Недавно я решил восполнить некоторые пробелы и написал расширение Stack Scopes для Visual Studio Code работающее поверх стандартного C/C++ расширения. Его основное назначение работа с дампами процессов содержащими отладочную информацию, но нет причин не использовать его для рантайм отладки, если это уместно.

Возможности Stack Scopes

  1. Панель Scopes представляет дерево из фреймов упорядоченных расположению: модуль -> функция/метод -> фрейм. Это позволяет быстро находить интересущие части кода, просматривать аргументы и переменные функций одновременно нескольких фреймов, оценивать количество вызовов отдельных функций или методов классов, анализировать на предмет рекурсий. Увидеть расположения фреймов, функций и модулей в стеках потоков можно кликнув соответствующую иконку на нужном элементе.

  2. Работа со стеками в боковой панели довольно неудобна. Этот недостаток призван решить Stack Graph. Его задача дать возможность подсвечивать разделяемые части кода - модули, функции, а так же объекты. Последняя колонка таблицы стека представляет пространство объекта, если содержит {...} и пространство функции, если содержит .... Для подсветки мест использования интересующих элементов нужно кликнуть мышью по нужному элементу зажав при этом клавишу Ctrl или правую кнопку мыши. То же самое можно получить кликнув соответствующую иконку на нужном элементе в дереве Scopes.

  3. Stack Graph, как и Scopes поддерживает просмотр контекста фрейма на любую глубину. Просто кликните по иконке фрейма или переменной, чтобы раскрыть их содержимое вглубь по иерархии.

  4. Scopes и Stack Graph поддерживают навигацию по исходному коду соответствующих фреймов. Разумеется, если такой код имеется, и программа содержит отладочную информацию.

  5. Как правило, отладчики показывают содержимое только первых элементов динамических массивов, так как не знают его размера. Следующие элементы можно сгенерировать с помощью выражений в окне наблюдения или непосредственно в дереве Scopes. Оно умеет распознавать динамические массивы, если их типы определены без typedef как обычные указатели. Такие переменные имеют специальный узел ... клик по которому генерирует следующий элемент массива.

  6. Иногда нужно найти в стеке ссылки на некоторые переменные, в том числе и вложенные в другие. Для этого реализована функция поиска по стеку. Вызвать ее можно из контекстного меню переменной в Stack Graph или кликом по иконке поиска на нужной переменной в дереве Scopes. Результаты поиска отобразятся в окне References.

  7. Для удобства работы со стеками в окне Stack Graph имеется режим минимизации, позволяющий просматривать только подсвеченные стеки. Кнопка в правом верхнем углу позволяет переключаться между режимами.

Для всех команд имеется возможность настроить горячие клавиши.

Расширение Stack Scopes свободное с открытым исходным кодом доступное для использования всеми кто найдет его полезным. В планах развивать его дальше и в перспективе дополнить функционалом профилирования, анализа кучи, создав полнофункциональный отладочный инструмент. Приглашаю всех заинтересованных, готовых внести свой вклад к совместной работе.

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


  1. Delsian
    24.11.2021 21:02

    А можно ли как-то это расширение подружить с расширением Cortex Debug? Запустил на радостях отладку - а Scopes оказался пустым. Печаль :(


    1. novemix Автор
      24.11.2021 21:19
      +1

      Незнаком еще с Cortex Debug. Stack Scopes не имеет собственного debug adapter, а использует реализацию адаптера стандартного C++ расширения. Если Cortex Debug полноценно реализует DAP, то наверное можно их подружить. Изучу этот вопрос по возможности.


  1. sergio_nsk
    24.11.2021 21:56
    -2

    Что это за язык программирования C/C++ такой? Где почитать про него?


    1. VXP
      25.11.2021 02:30
      -2

      Чел, ты...


  1. Junecat
    24.11.2021 23:52
    +3

    Большое спасибо за большую и прекрасно проделанную работу!
    Расширений, которые бы помогали в отладке С++ - не так уж много.

    Успехов Вам в развитии расширения!


  1. Borikinternet
    26.11.2021 02:56
    -2

    Ребят, вот не сочтите за рекламу: clion стоит в месяц столько же, сколько стоит 10 минут работы программиста на c/c++. На настройку visual studio code до аналогично удобного состояния вы потратите столько времени, сколько, если бы вы потратили их на программирование, позволило бы Вам купить не одну годовую подписку на clion. Зачем????


    1. svr_91
      26.11.2021 08:31

      Както пробовал clion, и очень долго, месяца 3-4, и не понял, в чем его преимущество перед другими ide. Тоесть для какойнибудь Java он может и пойдет, но C++ - это другой язык, со своими особенностями. Например, у меня при открытии каждого файла и при малейшем изменении в нем начинался долгий и мучительный процесс распарсивания (а на самом деле компиляции, в C++ без этого никак) этого файла, в результате я почти все время видел файл без подсветки, на фоне вечное жужжание кулеров процессора, а когда распарсивание все-таки завершалось (если конечно завершалось, а не зависало намертво без возможности продолжить работу), то все равно оказывалось, что две трети файла он спарсить не смог, и зачем в результате он все это делал, совершенно не понятно.


      1. Borikinternet
        28.11.2021 17:24

        Видел такие проблемы (которые прям бесят, я даже на них тикет заводил) с большими проектами (на пару тысяч файлов) и расположением всех файлов в файловой системе WSL. Но тот же самый проект на родной для операционки файловой системе работает вполне шустро (пробовал в винде и на centos). Активно использую его для C/C++ последние пол года и, в общем, нареканий его на работу на работу у меня (кроме работы с файлами на WSL) нет.

        Преимущество в том, что за него я сел и поехал. Настраивать необходимо только окружение под каждый проект, но это касается любого проекта на плюсах (либы, заголовки, версии компилятора и вот это вот все)


        1. svr_91
          28.11.2021 19:39

          А вы на ноутбуке работаете или на станционарном? Слышал, что при работе на ноутбуке у них отключаются какие-то модули и за счет этого он начинает работать внезапно быстрее и беспроблемнее, чем на большом пк.

          В целом конечно все не настолько драмматично, как я описал, но вот есть тотже qt creator например, примерно с тем же принципом работы но чуть другими фишечками, но бесплатный, и глядя на это совершенно не понятно, за что собственно платить.

          Про то, что настраивать, мне почему-то показалось, что в clion-е как раз на настройку у меня ушло больше времени, чем в любой другой ide, но конечно не настолько много, как в vscode, который я настраивал, настраивал и бросил.

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


          1. Borikinternet
            30.11.2021 14:01

            На ноуте работаю, да... Про отличающиеся модули для ноута и стационарного ПК это выглядит для меня странно, но может быть.

            QT-Creator не пробовал, сравнить не могу. Сравнивал с VS, VS code и, кажется, с чем-то из инфраструктуры eclips`а. Из перечисленных остановился на jetbrains и пока не жалею. Кроме всего прочего, меня весьма привлекает возможность иметь сразу пачку очень похожих друг на друга IDE, позволяющих работать со всеми используемыми мною языками.