Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Varsayılan olarak TraceProcessor, izleme işlenirken verilere belleğe yükleyerek erişir. Bu arabelleğe alma yaklaşımının kullanımı kolaydır, ancak bellek kullanımı açısından pahalı olabilir.
TraceProcessor ayrıca izleme sağlar. Birden çok izleme verisi türüne akışla erişmeyi destekleyen UseStreaming(), bu verileri bellekte arabelleğe alma yerine izleme dosyasından okundukça işleme. Örneğin, bir sistem çağrıları izlemesi oldukça büyük olabilir ve bir izlemedeki sistem çağrıları listesinin tamamını arabelleğe almak yüksek maliyetli olabilir.
Arabelleğe alınan verilere erişme
Aşağıdaki kod, syscall verilerine normal, arabelleğe alınan bir yöntemle, `trace.UseSyscalls()` çağrısını kullanarak erişmeyi gösterir.
using Microsoft.Windows.EventTracing;
using Microsoft.Windows.EventTracing.Processes;
using Microsoft.Windows.EventTracing.Syscalls;
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
if (args.Length != 1)
{
Console.Error.WriteLine("Usage: <trace.etl>");
return;
}
using (ITraceProcessor trace = TraceProcessor.Create(args[0]))
{
IPendingResult<ISyscallDataSource> pendingSyscallData = trace.UseSyscalls();
trace.Process();
ISyscallDataSource syscallData = pendingSyscallData.Result;
Dictionary<IProcess, int> syscallsPerCommandLine = new Dictionary<IProcess, int>();
foreach (ISyscall syscall in syscallData.Syscalls)
{
IProcess process = syscall.Thread?.Process;
if (process == null)
{
continue;
}
if (!syscallsPerCommandLine.ContainsKey(process))
{
syscallsPerCommandLine.Add(process, 0);
}
++syscallsPerCommandLine[process];
}
Console.WriteLine("Process Command Line: Syscalls Count");
foreach (IProcess process in syscallsPerCommandLine.Keys)
{
Console.WriteLine($"{process.CommandLine}: {syscallsPerCommandLine[process]}");
}
}
}
}
Akış verilerine erişme
Büyük bir sistem çağrısı iz kaydı ile sistem çağrısı verilerini bellekte arabelleğe almak oldukça maliyetli olabilir veya hatta mümkün olmayabilir. Aşağıdaki kod, aynı syscall verilerine akış olarak erişmeyi ve trace.UseSyscalls()'ı trace.UseStreaming().UseSyscalls() ile değiştirmeyi gösterir.
using Microsoft.Windows.EventTracing;
using Microsoft.Windows.EventTracing.Processes;
using Microsoft.Windows.EventTracing.Syscalls;
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
if (args.Length != 1)
{
Console.Error.WriteLine("Usage: <trace.etl>");
return;
}
using (ITraceProcessor trace = TraceProcessor.Create(args[0]))
{
IPendingResult<IThreadDataSource> pendingThreadData = trace.UseThreads();
Dictionary<IProcess, int> syscallsPerCommandLine = new Dictionary<IProcess, int>();
trace.UseStreaming().UseSyscalls(ConsumerSchedule.SecondPass, context =>
{
Syscall syscall = context.Data;
IProcess process = syscall.GetThread(pendingThreadData.Result)?.Process;
if (process == null)
{
return;
}
if (!syscallsPerCommandLine.ContainsKey(process))
{
syscallsPerCommandLine.Add(process, 0);
}
++syscallsPerCommandLine[process];
});
trace.Process();
Console.WriteLine("Process Command Line: Syscalls Count");
foreach (IProcess process in syscallsPerCommandLine.Keys)
{
Console.WriteLine($"{process.CommandLine}: {syscallsPerCommandLine[process]}");
}
}
}
}
Akış nasıl çalışır?
Varsayılan olarak, izlemeden ilk geçiş sırasında tüm akış verileri sağlanır ve diğer kaynaklardan arabellekteki veriler mevcut değildir. Yukarıdaki örnekte akışın arabelleğe alma ile nasıl birleştirildiği gösterilmektedir. Syscall verileri akışa almadan önce iş parçacığı verileri arabelleğe alınıyor. Sonuç olarak, izleme, önce arabelleğe alınmış iş parçacığı verilerini almak için bir kez, ardından bu verilerle akış sistem çağrısı (syscall) verilerine erişmek için tekrar okunmalıdır. Akış ve arabelleğe alma işlemini bu şekilde birleştirmek için bu örnek, ConsumerSchedule.SecondPass'ı trace.UseStreaming().UseSyscalls() fonksiyonlarına geçirir. Bu, syscall işlemlerinin iz üzerinden ikinci bir geçişte gerçekleşmesine neden olur. syscall geri çağırması, ikinci bir geçişte çalıştırıldığında, UseThreads()'den gelen izlemedeki bekleyen sonuca erişebilir ve bu esnada her syscall'u işler. Bu isteğe bağlı bağımsız değişken olmadan, syscall akışı izi ilk geçişte (sadece bir geçiş olacak) çalıştırılmış olurdu ve trace.UseThreads()'in bekleyen sonucu henüz mevcut olmazdı. Bu durumda, geri çağırma işlemi syscall'dan ThreadId'ye yine de erişebilir, ancak iş parçacığının işlemesine erişimi olmaz (bağlama verilerini işlemeye yönelik iş parçacığı henüz işlenmemiş olabilecek diğer olaylar aracılığıyla sağlandığından).
Arabelleğe alma ve akış arasındaki kullanımdaki bazı önemli farklar:
- Arabelleğe alma bir IPendingResult<T>döndürür ve içerdiği sonuç yalnızca izleme işlenmeden önce kullanılabilir. İzleme işlendikten sonra sonuçlar foreach ve LINQ gibi teknikler kullanılarak numaralandırılabilir.
- Akış hiçbir şey döndürmez ve bunun yerine bir geri çağırma argümanı alır. Her öğe kullanılabilir hale geldikçe, geri çağırma fonksiyonunu bir kez çalıştırır. Veriler arabelleğe alınmadığından, foreach veya LINQ ile listelenebilmesi için bir sonuç listesi asla oluşturulmaz; akış geri çağırması, işleme tamamlandıktan sonra kullanmak üzere saklamak istediği verinin istediği kısmını arabelleğe almalıdır.
- Buffered verileri işlemeye yönelik kod, trace.Process() çağrısından sonra, bekleyen sonuçlar kullanılabilir olduğunda görünür.
- Akış verilerini işlemeye yönelik kod, trace.Process() çağrısından önce, trace.UseStreaming.Use...() yöntemi için bir geri çağırma (callback) olarak görünür.
- Akış tüketicisi, akışın yalnızca bir bölümünü işlemeyi ve context.Cancel() yöntemini çağırarak gelecekteki geri çağırmaları iptal etmeyi seçebilir. Arabelleğe alan bir tüketiciye her zaman tam, arabelleğe alınan bir liste sağlanır.
Bağıntılı akış verileri
Bazen izleme verileri bir dizi olay halinde gelir; örneğin, syscall'lar ayrı giriş ve çıkış olaylarıyla günlüğe kaydedilir, ancak her iki olaydaki birleştirilmiş veriler daha yararlı olabilir. UseStreaming() ve UseSyscalls() yöntemleri, bu olayların her ikisinden de verileri ilişkilendirerek çift kullanıma sunuldukça bunu sağlar. İzleme yoluyla birkaç bağıntılı veri türü kullanılabilir. UseStreaming():
| Kod | Açıklama |
|---|---|
| iz. UseStreaming(). UseContextSwitchData() | Akışlar, daha doğru SwitchInThreadId'lerle (sıkıştırılmış ve sıkıştırılmamış olaylardan, ham olmayan olaylara göre) ilişkilendirilmiş kontekst değişimi verileri içerir. |
| trace. UseStreaming(). UseScheduledTasks() | İlişkili zamanlanmış görev verilerinin akışını sağlar. |
| iz. UseStreaming(). UseSyscalls() | Bağıntılı sistem çağrı verilerinin akışını sağlar. |
| iz. UseStreaming(). UseWindowInFocus() | İlişkili odaktaki pencere verilerinin akışını sağlar. |
Bağımsız yayın etkinlikleri
Ayrıca, trace.UseStreaming() bir dizi farklı tek başına olay türü için ayrıştırılmış olaylar sağlar.
| Kod | Açıklama |
|---|---|
| izleme.UseStreaming().UseLastBranchRecordEvents() | Akışlar son dal kaydı (LBR) olaylarını ayrıştırdı. |
| trace. UseStreaming(). UseReadyThreadEvents() | Ayrıştırılarak hazır hale getirilmiş iş parçacığı olay akışları. |
| izleme. UseStreaming(). UseThreadCreateEvents() | Akışlar, iş parçacığı oluşturma olaylarını ayrıştırır. |
| iz. UseStreaming(). UseThreadExitEvents() | Akışlar, iş parçacığı çıkış olaylarını ayrıştırır. |
| izleme.UseStreaming().UseThreadRundownStartEvents() | Akışlar ayrıştırılan iş parçacığı çalıştırma başlatma olayları. |
| izleme.UseStreaming().UseThreadRundownStopEvents() | Akışlar ayrıştırılan iş parçacığı çalıştırma durdurma olayları. |
| iz. UseStreaming(). UseThreadSetNameEvents() | İş parçacığı kümesi adı olaylarını ayrıştıran akışlar. |
Bağıntılı veriler için altında yatan akış olayları
Son olarak, trace.UseStreaming() yukarıdaki listedeki verileri ilişkilendirmek için kullanılan temel olayları da sağlayarak izleme işlevi görür. Bu temel olaylar şunlardır:
| Kod | Açıklama | Dahil edilenler |
|---|---|---|
| iz. UseStreaming(). UseCompactContextSwitchEvents() | Akışlar yoğunlaştırılmış bağlam değişikliği olaylarını ayrıştırdı. | iz. UseStreaming(). UseContextSwitchData() |
| iz. UseStreaming(). UseContextSwitchEvents() | Veri akışları ayrıştırılan bağlam değiştirme olayları. SwitchInThreadId'ler bazı durumlarda doğru olmayabilir. | iz. UseStreaming(). UseContextSwitchData() |
| izle.UseStreaming().UseFocusChangeEvents() | Akışlar pencere odağı değişim olaylarını ayrıştırır. | iz. UseStreaming(). UseWindowInFocus() |
| izleme.UseStreaming().UseScheduledTaskStartEvents() | Akışlar zamanlanmış görev başlatma olaylarını ayrıştırdı. | trace. UseStreaming(). UseScheduledTasks() |
| iz. UseStreaming(). UseScheduledTaskStopEvents() | Akışlar zamanlanmış görev durdurma olaylarını ayrıştırdı. | trace. UseStreaming(). UseScheduledTasks() |
| izleme.UseStreaming().UseScheduledTaskTriggerEvents() | Akışlar zamanlanmış görev tetikleyici olaylarını ayrıştırdı. | trace. UseStreaming(). UseScheduledTasks() |
| iz. UseStreaming(). UseSessionLayerSetActiveWindowEvents() | Oturum katmanı kümesini ayrıştıran akışlar, aktif pencere olaylarını belirler. | iz. UseStreaming(). UseWindowInFocus() |
| iz.UseStreaming().UseSyscallEnterEvents() | Ayrıştırılmış sistem çağrısı giriş olaylarını akışlar. | iz. UseStreaming(). UseSyscalls() |
| iz. UseStreaming(). UseSyscallExitEvents() | Akışlar, syscall çıkış olaylarını ayrıştırıyor. | iz. UseStreaming(). UseSyscalls() |
Sonraki Adımlar
Bu öğreticide izleme verilerine hemen erişmek ve daha az bellek kullanmak için akışı kullanmayı öğrendiniz.
Sonraki adım, izlemelerinizden istediğiniz verilere erişmektir. Bazı fikirler için örneklere bakın. Tüm izlemelerin desteklenen tüm veri türlerini içermediğini unutmayın.
Windows developer