Analyze your builds programmatically with the C++ Build Insights SDK

от автора

Рады рассказать о выпуске C++ Build Insights SDK, фреймворка, который дает вам доступ к информации о времени сборки MSVC через API C и C++. В дополнение к этому выпуску мы публикуем vcperf open source на GitHub. Поскольку сам vcperf построен с использованием SDK, вы можете использовать его в качестве справочного материала при разработке собственных инструментов. Мы будем рады увидеть, какие приложения вы будете создавать с помощью SDK, и мы с нетерпением ждем ваших отзывов!

Предпосылки

В прошлом ноябре мы представилиvcperf и его плагин Windows Performance Analyzer (WPA), которые помогают пользователям MSVC понимать время их сборки. Оба компонента были анонсированы под эгидой C++ Build Insights. Но что такое C++ Build Insights?

В ноябре мы уже рассказывали, что C++ Build Insights основан на Event Tracing для Windows (ETW), удобном механизме трассировки, доступном в операционной системе Windows. Но для масштабирования нашей технологии до очень больших сборок C++, сделанных нашими заказчиками, ETW было недостаточно. Нам нужно было точно настроить модель событий и используемые алгоритмы анализа. Результатом этой работы стала новая платформа анализа данных для MSVC, которую мы теперь называем C++ Build Insights.

Сегодня платформа C++ Build Insights — это то, что поддерживает vcperf и некоторые из наших внутренних инструментов. Тем не менее, мы хотели дать всем вам возможность извлечь из этого пользу. Для этого мы собрали его с интерфейсами C и C++, чтобы создать полноценный комплект разработки программного обеспечения.

Начните работу с C++ Build Insights SDK

Используйте C++ Build Insights SDK для создания пользовательских инструментов, соответствующих вашим сценариям:

  1. Анализировать трассировки программно, а не через WPA.
  2. Добавлять анализ времени сборки в вашу непрерывную интеграцию (CI).
  3. Или просто повеселиться!

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

  1. Скачайте и установите копию Visual Studio 2019.
  2. Получите маршрут (trace) вашей сборки.
    1. Запустите командную строку x64 Native Tools для VS 2019.
    2. Выполните следующую команду: vcperf /start MySessionName
    3. Создайте свой проект C++ из любого места, даже из Visual Studio (vcperf собирает события в масштабе всей системы).
    4. Выполните следующую команду: vcperf /stopnoanalyze MySessionName outputFile.etl. Это сохранит маршрут (trace) вашей сборки в файле outputFile.etl.

  3. Запустите Visual Studio и создайте новый проект C++.
  4. Щелкните правой кнопкой мыши на имени вашего проекта, выберите «Управление пакетами NuGet…» и установите последний пакет Microsoft.Cpp.BuildInsights NuGet из официального канала nuget.org. Вам будет предложено принять лицензию.
  5. Введите следующий код.
  6. Создайте и запустите, передав путь к outputFile.etl в качестве первого аргумента.

#include <iostream> #include <CppBuildInsights.hpp>   using namespace Microsoft::Cpp::BuildInsights; using namespace Activities;   class LongCodeGenFinder : public IAnalyzer { public:     // Вызывается драйвером анализа каждый раз, когда происходит остановка активности     // существует в маршруте (trace).      AnalysisControl OnStopActivity(const EventStack& eventStack) override     {         // Проверит, соответствует ли стек событий         // Сигнатура TopFunctionsFinder::CheckForTopFunction's.         // Если это так, он перешлет событие в функцию.           MatchEventStackInMemberFunction(eventStack, this,              &LongCodeGenFinder::CheckForLongFunctionCodeGen);           // Говорит драйверу анализа перейти к следующему событию           return AnalysisControl::CONTINUE;     }       // Эта функция используется для захвата событий активности функции, которые     // внутри CodeGeneration, а также напечатать список функций,     // на создание которых уходит более 500 миллисекунд.       void CheckForLongFunctionCodeGen(CodeGeneration cg, Function f)     {         using namespace std::chrono;           if (f.Duration() < milliseconds(500)) {             return;         }           std::cout << "Duration: " << duration_cast<milliseconds>(             f.Duration()).count();           std::cout << "\t Function Name: " << f.Name() << std::endl;     } };   int main(int argc, char *argv[]) {     if (argc <= 1) return -1;       LongCodeGenFinder lcgf;       // Давайте создадим группу анализаторов, которые будут получать события в трассировке (trace). У нас есть только один; легко!     auto group = MakeStaticAnalyzerGroup(&lcgf);       // argv[1] должен содержать путь к файлу трассировки     int numberOfPasses = 1;     return Analyze(argv[1], numberOfPasses, group); }

Клонируемая и встраиваемая версия этого примера также доступна в нашем репозитории GitHub с примерами C++ Build Insights..

Обратите внимание, что также можно получить трассировку программно, а не через vcperf, используя SDK. Подробности смотрите в официальной документации C ++ Build Insights SDK.

vcperf теперь open source

vcperf сам по себе создан с использованием C++ Build Insights SDK, и мы делаем его open-source на GitHub. Мы надеемся, что вы сможете использовать его, чтобы узнать больше о SDK и настроить vcperf под свои нужды. Репозиторий включает пример коммита, который расширяет vcperf для обнаружения компоновщиков, которые были перезапущены из-за ошибок. В примере выделяются эти вызовы в представлении C++ Build Insights ‘Build Explorer в WPA. Мы рекомендуем прочитать этот пример фиксации в следующем порядке:

  1. RestartedLinkerDetector.h
  2. BuildExplorerView.cpp
  3. Commands.cpp

Причина, по которой вы можете захотеть собрать и запустить vcperf из GitHub сегодня, заключается в том, чтобы получить доступ к новым событиям, которые еще не поддерживаются в выпущенной версии vcperf, включая события создания новых шаблонов. Обратите внимание, что vcperf не привязан к какой-либо конкретной версии Visual Studio, но новые события поддерживаются только в Visual Studio 2019 версии 16.4 и выше. Вот обновленная таблица событий:

Поделитесь мнением

Надеемся, что вам понравился релиз C++ Build Insights SDK, как и open source-версия vcperf. Скачайте Visual Studio 2019 сегодня и начните работу над первым приложением C++ Build Insights.

ссылка на оригинал статьи https://habr.com/ru/company/microsoft/blog/492336/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *