Gunakan simbol dalam .NET TraceProcessing
TraceProcessor mendukung pemuatan simbol dan mendapatkan tumpukan dari beberapa sumber data. Aplikasi konsol berikut melihat sampel CPU dan menghasilkan perkiraan durasi yang dijalankan fungsi tertentu (berdasarkan pengambilan sampel statistik penggunaan CPU pelacakan).
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]}");
}
}
}
}
Menjalankan program ini menghasilkan output yang mirip dengan berikut ini:
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
(Detail output akan bervariasi tergantung pada jejak).
Format simbol
Secara internal, TraceProcessor menggunakan format SymCache , yang merupakan cache dari beberapa data yang disimpan dalam PDB. Saat memuat simbol, TraceProcessor mengharuskan menentukan lokasi yang akan digunakan untuk file SymCache ini (jalur SymCache) dan mendukung secara opsional menentukan SymbolPath untuk mengakses PDB. Ketika SymbolPath disediakan, TraceProcessor akan membuat file SymCache dari file PDB sesuai kebutuhan, dan pemrosesan data yang sama berikutnya dapat menggunakan file SymCache secara langsung untuk performa yang lebih baik.
Langkah berikutnya
Dalam tutorial ini, Anda mempelajari cara memuat simbol saat memproses jejak.
Langkah selanjutnya adalah mempelajari cara menggunakan streaming untuk mengakses data pelacakan tanpa buffering semuanya dalam memori.
Windows developer