Visualizzatore eventi

In Performance Profiler puoi raccogliere informazioni di diagnostica durante l'esecuzione dell'app e quindi esaminare le informazioni raccolte dopo l'arresto dell'app, ad esempio un'analisi post-mortem.

Il visualizzatore eventi generici mostra l'attività dell'app tramite un elenco di eventi come il caricamento del modulo, l'avvio del thread e la configurazione di sistema. Questa visualizzazione consente di diagnosticare meglio le prestazioni dell'app all'interno del profiler di Visual Studio.

Attrezzaggio

  1. Selezionare ALT+F2 per aprire Il profiler prestazioni in Visual Studio.

  2. Selezionare la casella di controllo Visualizzatore eventi.

    The Events Viewer check box selected

  3. Selezionare il pulsante Start per eseguire lo strumento.

  4. Dopo l'avvio dell'esecuzione dello strumento, esaminare lo scenario da profilare nell'app. Selezionare quindi Interrompi raccolta o chiudi l'app per visualizzare i dati.

    A window showing Stop collection

Per altre informazioni su come rendere lo strumento più efficiente, vedere Ottimizzazione delle impostazioni di profilatura.

Informazioni sui dati

An event viewer trace

Nome colonna Descrizione
Nome provider Origine evento
Nome evento Evento specificato dal provider
Testo Descrizioni del provider, del nome dell'evento e dell'ID per l'evento
Timestamp (ms) Quando si è verificato l'evento
Provider Guid ID del provider di eventi
ID evento ID dell'evento
Process ID Processo da cui si è verificato l'evento (se noto)
Nome processo Nome del processo se è in esecuzione attivamente
ID thread ID del thread da cui si è verificato l'evento (se noto)

Se per impostazione predefinita manca una colonna, fare clic con il pulsante destro del mouse su una delle intestazioni di colonna esistenti e selezionare la colonna da aggiungere.

Adding columns to the event viewer

Quando si seleziona un evento, viene visualizzata la finestra Proprietà aggiuntive. Proprietà comuni mostra l'elenco delle proprietà che verranno visualizzate per qualsiasi evento. Le proprietà del payload mostrano proprietà specifiche dell'evento. Per alcuni eventi, è anche possibile visualizzare Stack.

The event viewer showing stacks

Organizzare i dati

Tutte le colonne, ad eccezione della colonna Text , sono ordinabili.

The event viewer trace

Il visualizzatore eventi visualizza fino a 20.000 eventi alla volta. Per concentrarsi sugli eventi di interesse, è possibile filtrare la visualizzazione degli eventi selezionando il filtro Evento. È anche possibile visualizzare la percentuale del numero totale di eventi che si sono verificati per ogni provider e queste informazioni offrono una suddivisione del tempo trascorso. Passare il puntatore del mouse su un singolo filtro eventi per visualizzare una descrizione comando che mostra:

  • Nome evento
  • Provider
  • GUID
  • Percentuale di eventi totali
  • Conteggio eventi

The event viewer event filter

Il filtro del provider mostra la percentuale del numero totale di eventi che si sono verificati per ogni provider. Passare il puntatore del mouse su un singolo provider per visualizzare una descrizione comando simile con il nome del provider, la percentuale di eventi totali e il numero di eventi.

The event viewer provider filter

Abilitare eventi ETW personalizzati

È possibile instrumentare il codice con eventi ETW personalizzati e abilitarli per la visualizzazione nel Visualizzatore eventi. Per abilitare eventi personalizzati:

  1. Compilare il codice evento personalizzato.

    Alla fine di questa sezione viene fornito un esempio di codice evento personalizzato C++.

  2. Aprire il Profiler prestazioni (ALT + F2), abilitare il Visualizzatore eventi e quindi selezionare l'icona Impostazioni (icona a forma di ingranaggio) accanto.

    Screenshot of the events viewer settings icon.

  3. Nella finestra di dialogo abilitare la prima riga in Provider aggiuntivi e quindi eseguire una delle azioni seguenti:

    • Per il codice dell'evento personalizzato nativo, impostare il GUID del provider in base al GUID per il codice evento personalizzato e lasciare vuoto il valore di Nome provider o usarne il valore predefinito.

    • Per il codice evento personalizzato C#, impostare lo stesso valore di Nome provider usato per dichiarare il codice dell'evento. Questo nome viene convertito in un GUID in background, quindi lasciare vuoto il GUID del provider.

      Per un evento personalizzato nativo, la riga dovrebbe essere simile alla figura seguente.

      Screenshot of the events viewer settings.

  4. Seleziona OK.

    L'evento personalizzato viene visualizzato nel Visualizzatore eventi quando si raccoglie una traccia di diagnostica e la si apre. La figura seguente mostra gli eventi personalizzati nel Visualizzatore eventi con filtro impostato per visualizzare solo l'evento personalizzato.

    Screenshot of the events viewer showing custom events.

Ecco un esempio di codice evento personalizzato per C++.

#include <Windows.h>
#include <evntprov.h>
#include <iostream>
#include <thread>

// This GUID must be regenerated so it is unique for your provider
// {7369B7AC-64EB-4618-B6B6-C8442B12E8F2}
GUID customEventProvider = { 0x7369b7ac, 0x64eb, 0x4618, { 0xb6, 0xb6, 0xc8, 0x44, 0x2b, 0x12, 0xe8, 0xf2 } };
REGHANDLE _customEventProviderRegHandle = 0;

// Id, Version, Channel, Level, OpCode, Task, Keyword
const EVENT_DESCRIPTOR CustomEventDescriptor = { 1, 0, 0, 0, 0, 0, 1 };

int main()
{
    // Register the provider
    ULONG res = ::EventRegister(&customEventProvider, nullptr, nullptr, &_customEventProviderRegHandle);
    if (res != ERROR_SUCCESS)
    {
        return res;
    }

    byte data[] = { 0xFF, 0xFF, 0xFF, 0xFF };
    EVENT_DATA_DESCRIPTOR eventData[1];
    ::EventDataDescCreate(&(eventData[0]), &data, sizeof(data));

    for (int i = 0; i < 10; ++i)
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
        ::EventWrite(_customEventProviderRegHandle, &CustomEventDescriptor, _countof(eventData), eventData);
        std::cout << "Wrote event\n";
    }

    res = ::EventUnregister(_customEventProviderRegHandle);
    if (res != ERROR_SUCCESS)
    {
        return res;
    }

    return 0;
}