Как стать автором
Обновить
0
Microsoft
Microsoft — мировой лидер в области ПО и ИТ-услуг

Анализируйте свои сборки программно с помощью C ++ Build Insights SDK

Время на прочтение4 мин
Количество просмотров2K
Автор оригинала: Microsoft
Рады рассказать о выпуске 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.
Теги:
Хабы:
Всего голосов 8: ↑8 и ↓0+8
Комментарии0

Публикации

Информация

Сайт
www.microsoft.com
Дата регистрации
Дата основания
Численность
Неизвестно
Местоположение
США

Истории