Compartir a través de


Uso de símbolos en TraceProcessing de .NET

TraceProcessor admite la carga de símbolos y la obtención de pilas de varios orígenes de datos. La siguiente aplicación de consola examina los ejemplos de CPU y genera la duración estimada de que se estaba ejecutando una función específica (en función del muestreo estadístico del seguimiento del uso de CPU).

using Microsoft.Windows.EventTracing;
using Microsoft.Windows.EventTracing.Cpu;
using Microsoft.Windows.EventTracing.Symbols;
using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        if (args.Length != 3)
        {
            Console.Error.WriteLine("Usage: GetCpuSampleDuration.exe <trace.etl> <imageName> <functionName>");
            return;
        }

        string tracePath = args[0];
        string imageName = args[1];
        string functionName = args[2];
        Dictionary<string, Duration> matchDurationByCommandLine = new Dictionary<string, Duration>();

        using (ITraceProcessor trace = TraceProcessor.Create(tracePath))
        {
            IPendingResult<ISymbolDataSource> pendingSymbolData = trace.UseSymbols();
            IPendingResult<ICpuSampleDataSource> pendingCpuSamplingData = trace.UseCpuSamplingData();

            trace.Process();

            ISymbolDataSource symbolData = pendingSymbolData.Result;
            ICpuSampleDataSource cpuSamplingData = pendingCpuSamplingData.Result;

            symbolData.LoadSymbolsForConsoleAsync(SymCachePath.Automatic, SymbolPath.Automatic).GetAwaiter().GetResult();

            Console.WriteLine();
            IThreadStackPattern pattern = AnalyzerThreadStackPattern.Parse($"{imageName}!{functionName}");

            foreach (ICpuSample sample in cpuSamplingData.Samples)
            {
                if (sample.Stack != null && sample.Stack.Matches(pattern))
                {
                    string commandLine = sample.Process.CommandLine;

                    if (!matchDurationByCommandLine.ContainsKey(commandLine))
                    {
                        matchDurationByCommandLine.Add(commandLine, Duration.Zero);
                    }

                    matchDurationByCommandLine[commandLine] += sample.Weight;
                }
            }

            foreach (string commandLine in matchDurationByCommandLine.Keys)
            {
                Console.WriteLine($"{commandLine}: {matchDurationByCommandLine[commandLine]}");
            }
        }
    }
}

La ejecución de este programa genera una salida similar a la siguiente:

C:\GetCpuSampleDuration\bin\Debug\> GetCpuSampleDuration.exe C:\boot.etl user32.dll LoadImageInternal
0.0% (0 of 1165; 0 loaded)
<snip>
100.0% (1165 of 1165; 791 loaded)
wininit.exe: 15.99 ms
C:\Windows\Explorer.EXE: 5 ms
winlogon.exe: 20.15 ms
"C:\Users\AdminUAC\AppData\Local\Microsoft\OneDrive\OneDrive.exe" /background: 2.09 ms

(Los detalles de la salida variarán en función del seguimiento).

Formato de los símbolos

Internamente, TraceProcessor usa el formato SymCache, que es una memoria caché de algunos de los datos almacenados en un archivo PDB. Al cargar símbolos, TraceProcessor requiere que se especifique una ubicación que se pueda usar para estos archivos SymCache (una ruta de acceso de SymCache) y, opcionalmente, permite especificar un elemento SymbolPath para acceder a los archivos PBS. Cuando se proporcione SymbolPath, TraceProcessor creará archivos SymCache a partir de archivos PDB según sea necesario, y el procesamiento posterior de los mismos datos puede usar los archivos SymCache directamente para mejorar el rendimiento.

Pasos siguientes

En este tutorial, ha aprendido a cargar símbolos al procesar seguimientos.

En el siguiente paso aprenderá a usar el streaming para acceder a los datos de seguimiento sin almacenar en búfer todo el contenido de la memoria.