Partager via


Visionneuse d’événements

Dans le Profileur de performance, vous pouvez recueillir des informations de diagnostic pendant que votre application est en cours d’exécution, puis examiner les informations recueillies après l’arrêt de l’application, comme une analyse post-mortem.

La visionneuse d’événements génériques affiche l’activité de l’application via une liste d’événements tels que la charge de module, le démarrage du thread et la configuration système. Cet affichage vous aide à mieux diagnostiquer le fonctionnement de votre application dans le profileur Visual Studio.

Programme d’installation

  1. Sélectionnez Alt+F2 pour ouvrir le Profileur de performances dans Visual Studio.

  2. Cochez la case Visionneuse d’événements.

    La case à cocher de la visionneuse d’événements sélectionnée

  3. Sélectionnez le bouton Démarrer pour exécuter l’outil.

  4. Une fois l’outil en cours d’exécution, parcourez le scénario pour établir un profil dans votre application. Sélectionnez ensuite Arrêter la collection ou fermez votre application pour afficher vos données.

    Une fenêtre montrant Arrêter la collection

Pour plus d’informations sur la manière de rendre l’outil plus efficace, consultez Optimisation des paramètres de profilage.

Comprendre vos données

Une trace de visionneuse d’événements

Nom de la colonne Description
Nom du fournisseur Source de l'événement
Nom de l'événement L’événement tel que spécifié par son fournisseur
Texte Descriptions du fournisseur, du nom d’événement et de l’ID de l’événement
Horodatage (ms) Lorsque l’événement a eu lieu
GUID du fournisseur L’ID du fournisseur d’événements
ID de l’événement L’ID de l'événement
ID du processus Le processus à partir duquel l’événement s’est produit (s’il est connu)
Nom du processus Le nom du processus s’il est en cours d’exécution active
ID du thread L’ID du thread à partir duquel l’événement s’est produit (s’il est connu)

Si une colonne est manquante par défaut, faites un clic droit sur l’un des en-têtes de colonne existants et sélectionnez la colonne que vous souhaitez ajouter.

Ajout de colonnes à la visionneuse d’événements

Lorsque vous sélectionnez un événement, la fenêtre Propriétés supplémentaires s’affiche. Les propriétés courantes affichent la liste des propriétés qui apparaîtront pour n’importe quel événement. Les propriétés de charge utile affichent des propriétés spécifiques à l’événement. Pour certains événements, vous pouvez également afficher Piles.

La visionneuse d’événements affichant les piles

Organiser vos données

Toutes les colonnes à l’exception de la colonne Texte sont triables.

La trace de la visionneuse d’événements

La visionneuse d’événements affiche jusqu’à 20 000 événements à la fois. Pour vous concentrer sur les événements qui vous intéressent, vous pouvez filtrer l’affichage des événements en sélectionnant le filtre d’événements. Vous pouvez également voir quel pourcentage du nombre total d’événements s’est produit pour chaque fournisseur, et ces informations vous permettent de savoir où votre temps est passé. Passez le curseur sur un filtre d’événements unique pour afficher une info-bulle qui affiche les éléments suivants :

  • Nom d'événement
  • Fournisseur
  • GUID
  • Pourcentage du total des événements
  • Nombre d’événements

Le filtre d’événements de la visionneuse d’événements

Le filtre fournisseur indique le pourcentage du nombre total d’événements survenus pour chaque fournisseur. Passez le curseur sur un seul fournisseur pour afficher une info-bulle similaire avec le nom du fournisseur, le pourcentage du total des événements et le nombre d’événements.

Le filtre du fournisseur de la visionneuse d’événements

Activer des événements ETW personnalisés

Vous pouvez instrumenter votre code avec des événements ETW personnalisés et les activer pour qu’ils s’affichent dans l’Observateur d’événements. Pour activer les événements personnalisés :

  1. Générez le code d’événement personnalisé.

    Un exemple de code d’événement personnalisé C++ est fourni à la fin de cette section.

  2. Ouvrez le Profileur de performances (Alt + F2), activez l’Observateur d’événements, puis sélectionnez l’icône Paramètres (icône d’engrenage) en regard de celle-ci.

    Capture d’écran de l’icône des paramètres de la visionneuse d’événements.

  3. Dans la boîte de dialogue, activez la première ligne sous Fournisseurs supplémentaires, puis effectuez l’une des actions suivantes :

    • Pour le code d’événement personnalisé natif, définissez le GUID du fournisseur en fonction du GUID du code d’événement personnalisé et laissez la valeur Nom du fournisseur vide ou utilisez sa valeur par défaut.

    • Pour le code d’événement personnalisé C#, définissez la même valeur Nom du fournisseur que celle utilisée lors de la déclaration de votre code d’événement. Ce nom est converti en GUID en arrière-plan. Laissez donc le GUID du fournisseur vide.

      Pour un événement personnalisé natif, la ligne doit ressembler à l’illustration suivante.

      Capture d’écran des paramètres de la visionneuse d’événements.

  4. Cliquez sur OK.

    L’événement personnalisé s’affiche dans l’Observateur d’événements lorsque vous collectez une trace de diagnostics et que vous l’ouvrez. L’illustration suivante montre les événements personnalisés dans l’Observateur d’événements avec un filtrage défini pour afficher uniquement l’événement personnalisé.

    Capture d’écran de la visionneuse d’événements montrant des événements personnalisés.

Voici un exemple de code d’événement personnalisé pour 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;
}