Анализируйте свои сборки программно с помощью 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/


Интересные статьи

Интересные статьи

Слева — Танай Тандон, в 17 лет в 2014 году основал стартап Athelas для диагностики малярии при помощи смартфона. Справа — соосновательница Athelas Дипика Бодопати. Несколько лет н...
… или как я изобретал собственные велосипеды с преферансами и гейшами на свой вкус — писал с нуля прошивку для фотополимерного принтера. На данный момент прошивка уже вполне работ...
Привет Хабр. После недавней публикации про передачу OFDM, стало интересно проверить, каким способом эффективнее всего передавать данные по воздуху. Мы попробуем разные виды модуляции, и посмот...
В мае 2019 года GitHub анонсировала выход сервиса Package Registry. Вслед за этим, уже в августе, была анонсирована поддержка CI/CD в Actions. В статье я расскажу, что это за сервисы и как это м...
Если вы последние лет десять следите за обновлениями «коробочной версии» Битрикса (не 24), то давно уже заметили, что обновляется только модуль магазина и его окружение. Все остальные модули как ...