Analysieren Sie Ihre Builds programmgesteuert mit dem C ++ Build Insights SDK

Wir freuen uns, die Veröffentlichung des  C ++ Build Insights SDK bekannt zu geben , eines Frameworks, mit dem Sie über die C- und C ++ - APIs auf Informationen zur MSVC-Erstellungszeit zugreifen können. Zusätzlich zu dieser Version veröffentlichen wir  vcperf Open Source auf GitHub . Da vcperf selbst mit dem SDK erstellt wird, können Sie es als Referenz bei der Entwicklung Ihrer eigenen Tools verwenden. Wir werden uns freuen zu sehen, welche Anwendungen Sie mit dem SDK erstellen, und freuen uns auf Ihr Feedback!



Hintergrund


Im vergangenen November haben wir vcperf und sein WPA-Plugin (Windows Performance Analyzer) eingeführt , mit denen MSVC-Benutzer ihre Erstellungszeit besser verstehen können. Beide Komponenten wurden unter der Schirmherrschaft von C ++ Build Insights angekündigt. Aber was ist C ++ Build Insights?

Im November haben wir bereits gesagt, dass C ++ Build Insights auf Event Tracing für Windows  (ETW) basiert  , einem praktischen Verfolgungsmechanismus, der im Windows-Betriebssystem verfügbar ist. ETW reichte jedoch nicht aus, um unsere Technologie auf die sehr großen C ++ - Builds unserer Kunden zu skalieren. Wir mussten das Ereignismodell und die verwendeten Analysealgorithmen optimieren. Das Ergebnis dieser Arbeit ist eine neue Datenanalyseplattform für MSVC, die wir jetzt C ++ Build Insights nennen.

Heute unterstützen vcperf und einige unserer internen Tools die C ++ Build Insights-Plattform. Trotzdem wollten wir Ihnen allen die Möglichkeit geben, davon zu profitieren. Zu diesem Zweck haben wir es mit den C- und C ++ - Schnittstellen zusammengestellt, um ein vollständiges Softwareentwicklungskit zu erstellen.

Beginnen Sie mit dem C ++ Build Insights SDK


Verwenden Sie das C ++ Build Insights SDK, um benutzerdefinierte Tools zu erstellen, die zu Ihren Skripten passen:

  1. Analysieren Sie Traces programmgesteuert, nicht über WPA.
  2. Fügen Sie Ihrer kontinuierlichen Integration (CI) eine Analyse der Erstellungszeit hinzu.
  3. Oder einfach nur Spaß haben!


So können Sie mit dem SDK beginnen. Dieses Beispiel zeigt, wie Sie ein Programm erstellen, das Funktionen auflistet, deren Erstellung mehr als 500 Millisekunden dauert.



  1. Laden Sie eine Kopie von Visual Studio 2019 herunter und installieren Sie sie  .
  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);
}

Eine geklonte und eingebettete Version dieses Beispiels ist auch in unserem GitHub-Repository mit C ++ Build Insights-Beispielen verfügbar  . .

Beachten Sie, dass Sie den Trace mithilfe des SDK auch programmgesteuert und nicht über vcperf abrufen können. Weitere Informationen finden Sie in den White Papers zum C ++ Build Insights SDK .

vcperf ist jetzt Open Source


vcperf selbst wird mit dem C ++ Build Insights SDK erstellt und  auf GitHub als Open Source erstellt . Wir hoffen, dass Sie damit mehr über das SDK erfahren und vcperf an Ihre Bedürfnisse anpassen können. Das Repository enthält  ein Beispiel-Commit , das vcperf erweitert, um Linker zu erkennen, die aufgrund von Fehlern neu gestartet wurden. Das Beispiel hebt diese Aufrufe in der Build Explorer-Ansicht von C ++ Build Insights in WPA hervor. Wir empfehlen, dieses Commit-Beispiel in der folgenden Reihenfolge zu lesen:

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

Der Grund, warum Sie vcperf heute über GitHub erstellen und ausführen möchten, besteht darin, auf neue Ereignisse zuzugreifen, die in der veröffentlichten Version von vcperf noch nicht unterstützt werden, einschließlich neuer Ereignisse zum Erstellen von Vorlagen. Beachten Sie, dass vcperf nicht an eine bestimmte Version von Visual Studio gebunden ist, neue Ereignisse jedoch nur in Visual Studio 2019 Version 16.4 und höher unterstützt werden. Hier ist die aktualisierte Ereignistabelle:



Teile deine Meinung


Wir hoffen, dass Ihnen die C ++ Build Insights SDK- Version  sowie die Open Source-Version von vcperf gefallen. Laden Sie Visual Studio 2019 noch  heute herunter und starten Sie die erste C ++ Build Insights-App.

All Articles