Я много работаю с CMake. И периодически сталкиваюсь с довольно сложными и запутанными CMake-скриптами. Долгое время я использовал логи, чтобы разобраться в их работе и выполнить отладку. Позже обнаружил, что в CMake есть встроенный отладчик и профилировщик, которые сильно упрощают процесс отладки. Кажется, не все знают об их существовании и о том, как с ними работать, поэтому я решил написать эту статью.

Отладка CMake-файлов
Начиная с версии 3.27 и выше, в CMake появилась возможность отладки.
Скачать нужную версию CMake можно отсюда (или собрать из исходников). Более новую версию CMake допустимо использовать, даже если ваши CMake-файлы написаны для старой версии (но будьте осторожны).
Если по какой-то причине вы не можете использовать CMake 3.27 и выше, то читайте вторую половину статьи.
Как настроить и использовать отладчик, я покажу на примере VSCode. Но полученную информацию вы сможете применить и в других IDE (например, CLion и Visual Studio)
Чтобы запустить отладку в VSCode:
Установите расширение CMake Tools.
Откройте необходимый вам проект.
Нажмите
Ctrl+Shift+P
.В появившемся окне введите
cmake debugger
.После чего вы должны увидеть два пункта меню:
Разница между пунктами только в том, что
Delete Cache…
удаляет файлCMakeCache.txt
и выполняет повторную конфигурацию проекта.Выберите необходимый вариант и нажмите
Enter
.VSCode может дополнительно попросить указать компилятор и путь к исходникам. После этого отладчик должен запуститься.
Теперь вы можете пошагово отлаживать код, устанавливать breakpoint’ы и просматривать значения переменных:

К сожалению, с помощью отладчика нельзя отладить генераторные выражения.
Если отладка не запустилась
Если отладка не запускается или завершается с непонятной ошибкой, откройте вкладку OUTPUT
в VSCode. Там выводится CMake-команда, которую использует отладчик:

По сути, плагин просто запускает cmake с необходимыми для отладки флагами, а затем подключается к его отладчику по DAP.
Обратите внимание на пути после флагов -S
и -B
:
-S
указывает на папку с исходным кодом проекта;-B
указывает на папку, куда помещаются файлы сборки.
Если эти пути отличаются от ваших, то их можно исправить в настройках VSCode. Для этого установите значения cmake.sourceDirectory
и cmake.buildDirectory
соответственно.
Также обратите внимание на флаг -G
. Он определяет, какой используется генератор сборочной системы (Unix Makefiles, Ninja и другие). Его можно настроить с помощью опции cmake.generator
в VSCode.
Если сборка вашего CMake-проекта должна запускаться с дополнительными параметрами, то необходимо перечислить их в cmake.configureArgs
:

Или собрать проект привычным способом, а затем запустить отладчик, выбрав CMake: Configure with CMake Debugger
. В этом случае отладчик будет работать с уже сконфигурированным проектом и переменными, сохраненными в CMakeCache.txt
.
Если все настроено правильно, но отладка так и не заработала, сообщите об этом в комментариях — попробуем разобраться вместе.
Профилирование CMake
С версии CMake 3.18 также доступен профилировщик. С его помощью можно проанализировать последовательность выполнения команд, просмотреть вложенные вызовы и измерить время их работы.
Чтобы включить профилирование, добавьте в вашу команду генерации сборочной системы CMake следующие опции: --profiling-format=google-trace
и --profiling-output=fileName
.
Например, в результате вызова этой команды будет сгенерирован файл с именем trace
:
cmake -B my_build --profiling-format=google-trace --profiling-output=trace
Для просмотра trace-файла можно использовать любой chrome-based браузер или сайт ui.perfetto.dev.
Я покажу на примере Chrome. Откройте браузер, введите в адресной строке about:tracing
и нажмите Enter
. На открывшейся странице, нажмите кнопку Load
и выберите trace-файл.
После этого файл должен открыться, и вы сможете просмотреть трейс:

Если есть темы в CMake, которые вызывают у вас боль, пишите в комментариях, и я постараюсь рассказать о них в следующих статьях.