Приветствую, С/С++ разработчики, те, кто только изучает эти языки и просто интересующиеся! В этом посте речь пойдет об отладочном расширении 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
Панель Scopes представляет дерево из фреймов упорядоченных расположению:
модуль -> функция/метод -> фрейм
. Это позволяет быстро находить интересущие части кода, просматривать аргументы и переменные функций одновременно нескольких фреймов, оценивать количество вызовов отдельных функций или методов классов, анализировать на предмет рекурсий. Увидеть расположения фреймов, функций и модулей в стеках потоков можно кликнув соответствующую иконку на нужном элементе.https://raw.githubusercontent.com/novemus/stack-scopes/master/resources/scopes.gif
Работа со стеками в боковой панели довольно неудобна. Этот недостаток призван решить Stack Graph. Его задача дать возможность подсвечивать разделяемые части кода - модули, функции, а так же объекты. Последняя колонка таблицы стека представляет пространство объекта, если содержит
{...}
и пространство функции, если содержит...
. Для подсветки мест использования интересующих элементов нужно кликнуть мышью по нужному элементу зажав при этом клавишу Ctrl или правую кнопку мыши. То же самое можно получить кликнув соответствующую иконку на нужном элементе в дереве Scopes.https://raw.githubusercontent.com/novemus/stack-scopes/master/resources/graph.gif
Stack Graph, как и Scopes поддерживает просмотр контекста фрейма на любую глубину. Просто кликните по иконке фрейма или переменной, чтобы раскрыть их содержимое вглубь по иерархии.
https://raw.githubusercontent.com/novemus/stack-scopes/master/resources/unfold.gif
Scopes и Stack Graph поддерживают навигацию по исходному коду соответствующих фреймов. Разумеется, если такой код имеется, и программа содержит отладочную информацию.
https://raw.githubusercontent.com/novemus/stack-scopes/master/resources/reveal.gif
Как правило, отладчики показывают содержимое только первых элементов динамических массивов, так как не знают его размера. Следующие элементы можно сгенерировать с помощью выражений в окне наблюдения или непосредственно в дереве Scopes. Оно умеет распознавать динамические массивы, если их типы определены без
typedef
как обычные указатели. Такие переменные имеют специальный узел...
клик по которому генерирует следующий элемент массива.https://raw.githubusercontent.com/novemus/stack-scopes/master/resources/evaluate.gif
Иногда нужно найти в стеке ссылки на некоторые переменные, в том числе и вложенные в другие. Для этого реализована функция поиска по стеку. Вызвать ее можно из контекстного меню переменной в Stack Graph или кликом по иконке поиска на нужной переменной в дереве Scopes. Результаты поиска отобразятся в окне References.
https://raw.githubusercontent.com/novemus/stack-scopes/master/resources/search.gif
Для удобства работы со стеками в окне Stack Graph имеется режим минимизации, позволяющий просматривать только подсвеченные стеки. Кнопка в правом верхнем углу позволяет переключаться между режимами.
https://raw.githubusercontent.com/novemus/stack-scopes/master/resources/minimize.gif
Для всех команд имеется возможность настроить горячие клавиши.
Расширение Stack Scopes свободное с открытым исходным кодом доступное для использования всеми кто найдет его полезным. В планах развивать его дальше и в перспективе дополнить функционалом профилирования, анализа кучи, создав полнофункциональный отладочный инструмент. Приглашаю всех заинтересованных, готовых внести свой вклад к совместной работе.