Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
TraceProcessor поддерживает загрузку символов и получение стеков из нескольких источников данных. В следующем консольном приложении рассматриваются примеры ЦП и выводится предполагаемое время выполнения определенной функции (на основе статистической выборки использования ЦП трассировки).
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]}");
}
}
}
}
Эта программа возвращает выходные данные, подобные следующим:
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
(Выходные данные будут зависеть от трассировки).
Формат символов
На внутреннем уровне TraceProcessor использует формат SymCache, который представляет собой кэш некоторых данных, хранящихся в PDB. При загрузке символов TraceProcessor требует указать расположение для этих файлов SymCache (путь SymCache) и поддерживает при необходимости указание SymbolPath для доступа к PDB. Когда предоставляется SymbolPath, TraceProcessor будет создавать файлы SymCache из PDB-файлов по мере необходимости, а при дальнейшей обработке одних и тех же данных можно использовать файлы SymCache напрямую для повышения производительности.
Следующие шаги
В этом учебнике вы узнали, как загружать символы при обработке трассировок.
Следующий шаг — узнайте, как использовать потоковую передачу для доступа к данным трассировки без буферизации всех данных в памяти.
Windows developer