.NET TraceProcessing'de sembolleri kullanma

TraceProcessor , simgeleri yüklemeyi ve çeşitli veri kaynaklarından yığın almayı destekler. Aşağıdaki konsol uygulaması, CPU örneklerine bakar ve belirli bir işlevin çalıştırıldığı tahmini süreyi (izlemenin CPU kullanımına ilişkin istatistiksel örneklemesine göre) gösterir.

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]}");
            }
        }
    }
}

Bu programın çalıştırılması aşağıdakine benzer bir çıkış oluşturur:

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

(Çıkış ayrıntıları izlemeye bağlı olarak değişir).

Simgeler biçimi

TraceProcessor dahili olarak, PDB'de depolanan bazı verilerin önbelleği olan SymCache biçimini kullanır. Sembolleri yüklerken TraceProcessor, bu SymCache dosyaları (SymCache yolu) için kullanılacak bir konum belirtmeyi gerektirir ve isteğe bağlı olarak PDB'lere erişmek için bir SymbolPath belirtmeyi destekler. Bir SymbolPath sağlandığında, TraceProcessor gerektiğinde PDB dosyalarından SymCache dosyaları oluşturur ve aynı verilerin daha sonra işlenmesi daha iyi performans için doğrudan SymCache dosyalarını kullanabilir.

Sonraki Adımlar

Bu öğreticide, izleri işlerken sembolleri nasıl yükleyeceğinizi öğrendiniz.

Sonraki adım, bellekteki her şeyi arabelleğe almadan izleme verilerine erişmek için akış kullanmayı öğrenmektir.