SlideShare a Scribd company logo
ETW w służbie programisty .NET
ETW w służbie programisty .NET
@KonradKokosa
Logowanie zdarzeń w .NET
3
4
try
{
Console.WriteLine("Starting to process...");
var result = ProcessSomething();
if (result > 0)
{
Console.WriteLine("Pies1 " + result);
ProcessMore();
Console.WriteLine("Pies2");
ProcessWithException(result);
Console.WriteLine("Pies3");
}
Console.WriteLine("Processing ended.");
}
catch (Exception ex)
{
Console.WriteLine($"Ojojoj... {ex.Message}");
}
5
try
{
Console.WriteLine("Starting to process...");
var result = ProcessSomething();
if (result > 0)
{
Console.WriteLine("Pies1 " + result);
ProcessMore();
Console.WriteLine("Pies2");
ProcessWithException(result);
Console.WriteLine("Pies3");
}
Console.WriteLine("Processing ended.");
}
catch (Exception ex)
{
Console.WriteLine($"Ojojoj... {ex.Message}");
}
try
{
logger.Info("Starting to process...");
var result = ProcessSomething();
if (result > 0)
{
logger.Debug($"Pies1 {result}");
ProcessMore();
logger.Debug("Pies2");
ProcessWithException(result);
logger.Debug("Pies3");
}
logger.Info("Processing ended.");
}
catch (Exception ex)
{
logger.Error($"Ojojoj... {ex.Message}");
}
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="logfile" xsi:type="File" fileName="logs-nlog.txt" />
<target name="console" xsi:type="Console"
layout="${longdate}|${level}|${message}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="logfile,console" />
</rules>
</nlog>
try
{
logger.Info("Starting to process...");
var result = ProcessSomething();
if (result > 0)
{
logger.Debug($"Pies1 {result}");
ProcessMore();
logger.Debug("Pies2");
ProcessWithException(result);
logger.Debug("Pies3");
}
logger.Info("Processing ended.");
}
catch (Exception ex)
{
logger.Error($"Ojojoj... {ex.Message}");
}
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="logfile" xsi:type="File" fileName="logs-nlog.txt" />
<target name="console" xsi:type="Console"
layout="${longdate}|${level}|${message}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="logfile,console" />
</rules>
</nlog>
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.LiterateConsole()
.WriteTo.RollingFile("logs-serilog.txt")
.CreateLogger();
try
{
Log.Information("Starting to process...");
var result = ProcessSomething();
if (result > 0)
{
var debugData = new { Result = result, IsHappy = true };
Log.Debug("Pies1 {@data}", debugData);
ProcessMore();
Log.Debug("Pies2");
ProcessWithException(result);
Log.Debug("Pies3");
}
logger.Trace("Processing ended.");
}
catch (Exception ex)
{
Log.Error($"Ojojoj... {ex.Message}");
}
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.LiterateConsole()
.WriteTo.RollingFile("logs-serilog.txt")
.CreateLogger();
try
{
Log.Information("Starting to process...");
var result = ProcessSomething();
if (result > 0)
{
var debugData = new { Result = result, IsHappy = true };
Log.Debug("Pies1 {@data}", debugData);
ProcessMore();
Log.Debug("Pies2");
ProcessWithException(result);
Log.Debug("Pies3");
}
logger.Trace("Processing ended.");
}
catch (Exception ex)
{
Log.Error($"Ojojoj... {ex.Message}");
}
ETW
10
11
12
Event Tracing for Windows
13
Event Tracing for Windows
14
najpotężniejszy i... najbardziej niedoceniany
15
"strongly typed (schematized), extensible
logging system built into the Windows
Operating System"
16
17
Zalety:
• Ogromna ilość informacji
• Zerowy narzut gdy wyłączony
• Mały narzut gdy włączony (~kilka %)
• Nieinwazyjne włączanie/wyłączanie
• Precyzyjny (analiza wyścigów czasowych)
• Silnie typowany
• Całkiem niezły “tooling”
18
Zalety:
• Ogromna ilość informacji
• Zerowy narzut gdy wyłączony
• Mały narzut gdy włączony (~kilka %)
• Nieinwazyjne włączanie/wyłączanie
• Precyzyjny (analiza wyścigów czasowych)
• Silnie typowany
• Całkiem niezły “tooling”
19
Zalety:
• Ogromna ilość informacji
• Zerowy narzut gdy wyłączony
• Mały narzut gdy włączony (~kilka %)
• Nieinwazyjne włączanie/wyłączanie
• Precyzyjny (analiza wyścigów czasowych)
• Silnie typowany
• Całkiem niezły “tooling”
PRD
20
21
Wady:
• Całkiem niezły “tooling”
22
Timeline
Windows 2000
Windows Vista
Server 2003
Windows 7
Server 2008
Windows 8
Server 2012
2000 2007 2009 2012
Windows 10
2015
ETW ETW solidnie
rozwinięty
call-stack przy
każdym evencie
.NET 2.0
2005
Ulepszenia…
.NET 4.0
2010
ETW
dla CLR
.NET Core
2016
ETW
dla CoreCLR
23
Przykłady
24
eventvwr.exe
25
resmon.exe
26
perfmon.exe
27
Architektura
28
29
30
31
ETW Session
32
33
34
Jak to ugryźć?
35
logman query providers
logman query providers "Windows Kernel
Trace"
logman query providers | findstr DotNET
logman query providers -pid XXXX
36
xperf -loggers
37
ETW Event
38
Event ETW
• Id
• Version
• Keyword
• Level
• Opcode
• Task
• …
39
Przykładowe eventy
• Windows KernelProcessStart
• Windows KernelProcessEnd
• Windows KernelImageLoad – kiedy
ładowana jest DLLka
• Windows KernelTcpIpRecv – kiedy dociera
pakiet TCP/IP
• Windows KernelThreadCSwitch - kiedy
wątek dostaje albo traci dostęp do CPU
40
logman query providers ".NET Common
Language Runtime"
41
Eventy CLR
• MSDN (https://msdn.microsoft.com/en-us/library/dd264810(v=vs.110).aspx)
• manifest:
• CoreCLR
.coreclrsrcvmClrEtwAll.man
• .NET Framework 4.0+
c:WindowsMicrosoft.NETFramework64v4.0.30319CLR-ETW.man
• .NET Framework 2.0 - nie wspierał 
42
43
44
45
46
Narzędzia
49
Windows Performance Toolkit
50
51
52
Demo
53
Zalety:
• przyjemnie graficzny
• może posłużyć do tworzenia wykresów
Wady:
• nie wszystko da się narysować
• nie można podejrzeć stacktrace eventów
54
PerfView
55
PerfView
https://github.com/Microsoft/perfview
56
57
58
59
60
61
62
Demo
63
wtrace, etrace
https://github.com/lowleveldesign/wtrace
https://github.com/goldshtn/etrace
66
Programowanie
67
Kiedyś* - żmudne
* do 2012 - .NET 4.5
68
Teraz - EventSource
69
class Program
{
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("Enter command:");
string command = Console.ReadLine();
MySampleEventProvider.Log.Command(7, command);
}
}
}
sealed class MySampleEventProvider : EventSource
{
public void Command(long commandId, string Name)
{
WriteEvent(1, commandId, Name);
}
public static MySampleEventProvider Log = new MySampleEventProvider();
}
70
Teraz - TraceEvent
71
using (var session = new TraceEventSession("SimpleMontitorSession",
"MyEventsFile.etl"))
{
var eventSourceGuid =
TraceEventProviders.GetEventSourceGuidFromName("MyEventSource");
session.EnableProvider(eventSourceGuid);
Thread.Sleep(10000);
}
72
using (var session = new TraceEventSession("MyRealTimeSession"))
{
var providerName = "Microsoft-Windows-DotNETRuntime";
var eventSourceGuid =
TraceEventProviders.GetProviderGuidByName(providerName);
session.EnableProvider(eventSourceGuid);
session.Source.Clr.GCHeapStats += ClrOnGcHeapStats;
session.Source.Process();
}
Dziękuję za uwagę! Pytania?!
73

More Related Content

PPTX
ETW w służbie programisty .NET
PDF
Technologia Xamarin i wprowadzenie do Windows IoT core
PDF
RxJava & Hystrix - Perfect match for distributed applications
PDF
Podstawy AngularJS
PDF
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
PDF
02 - Mechanika TDD
PPTX
Tomek Banasiak: Jak bez stresu obserwować rosnący ruch w Twojej usłudze? Czyl...
PDF
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
ETW w służbie programisty .NET
Technologia Xamarin i wprowadzenie do Windows IoT core
RxJava & Hystrix - Perfect match for distributed applications
Podstawy AngularJS
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
02 - Mechanika TDD
Tomek Banasiak: Jak bez stresu obserwować rosnący ruch w Twojej usłudze? Czyl...
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?

Similar to ETW w służbie programisty .NET (20)

PDF
Monitoring sieci
PPTX
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
PPTX
Iron Python I Dlr
PDF
Secure Coding w praktyce.
PDF
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
PDF
CONFidence 2018: "Small money, a lot of bugs" - Large scale bughunting dla ty...
PDF
Programowanie sterowników w Linuksie.
PDF
DTrace, czyli jak zobaczyć to czego nie widać.
PDF
Testowanie- nauka czy sztuka? - Adam Roman
PDF
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
PPTX
[Confidence 2016] Red Team - najlepszy przyjaciel Blue Teamu
PPTX
Typescript - Object Oriented Approach in JS
PPTX
Jak podwoić wartość kodu .NET?
PDF
Michał Dec - Quality in Clouds
PDF
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
PDF
Devops/Sysops security
PPTX
Jak stworzyć udany system informatyczny
PDF
C#. Ćwiczenia. Wydanie II
PPTX
StreamInsight - Analiza danych w ruchu
PDF
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
Monitoring sieci
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
Iron Python I Dlr
Secure Coding w praktyce.
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
CONFidence 2018: "Small money, a lot of bugs" - Large scale bughunting dla ty...
Programowanie sterowników w Linuksie.
DTrace, czyli jak zobaczyć to czego nie widać.
Testowanie- nauka czy sztuka? - Adam Roman
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Confidence 2016] Red Team - najlepszy przyjaciel Blue Teamu
Typescript - Object Oriented Approach in JS
Jak podwoić wartość kodu .NET?
Michał Dec - Quality in Clouds
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Devops/Sysops security
Jak stworzyć udany system informatyczny
C#. Ćwiczenia. Wydanie II
StreamInsight - Analiza danych w ruchu
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
Ad

More from Konrad Kokosa (6)

PPTX
A miało być tak... bez wycieków
PPTX
Narysuj Swoją Karierę IT - Konrad Kokosa
PPTX
Wydajność webowa jak to ugryźć
PPTX
Zarzadzanie pamiecia w .NET - WDI
PPTX
BoilingFrogs 2016 - Web performance
PPTX
WG.NET 90 - Testy obciążeniowe – co, jak, czym?
A miało być tak... bez wycieków
Narysuj Swoją Karierę IT - Konrad Kokosa
Wydajność webowa jak to ugryźć
Zarzadzanie pamiecia w .NET - WDI
BoilingFrogs 2016 - Web performance
WG.NET 90 - Testy obciążeniowe – co, jak, czym?
Ad

ETW w służbie programisty .NET

  • 2. ETW w służbie programisty .NET @KonradKokosa
  • 4. 4 try { Console.WriteLine("Starting to process..."); var result = ProcessSomething(); if (result > 0) { Console.WriteLine("Pies1 " + result); ProcessMore(); Console.WriteLine("Pies2"); ProcessWithException(result); Console.WriteLine("Pies3"); } Console.WriteLine("Processing ended."); } catch (Exception ex) { Console.WriteLine($"Ojojoj... {ex.Message}"); }
  • 5. 5 try { Console.WriteLine("Starting to process..."); var result = ProcessSomething(); if (result > 0) { Console.WriteLine("Pies1 " + result); ProcessMore(); Console.WriteLine("Pies2"); ProcessWithException(result); Console.WriteLine("Pies3"); } Console.WriteLine("Processing ended."); } catch (Exception ex) { Console.WriteLine($"Ojojoj... {ex.Message}"); }
  • 6. try { logger.Info("Starting to process..."); var result = ProcessSomething(); if (result > 0) { logger.Debug($"Pies1 {result}"); ProcessMore(); logger.Debug("Pies2"); ProcessWithException(result); logger.Debug("Pies3"); } logger.Info("Processing ended."); } catch (Exception ex) { logger.Error($"Ojojoj... {ex.Message}"); } <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets> <target name="logfile" xsi:type="File" fileName="logs-nlog.txt" /> <target name="console" xsi:type="Console" layout="${longdate}|${level}|${message}" /> </targets> <rules> <logger name="*" minlevel="Trace" writeTo="logfile,console" /> </rules> </nlog>
  • 7. try { logger.Info("Starting to process..."); var result = ProcessSomething(); if (result > 0) { logger.Debug($"Pies1 {result}"); ProcessMore(); logger.Debug("Pies2"); ProcessWithException(result); logger.Debug("Pies3"); } logger.Info("Processing ended."); } catch (Exception ex) { logger.Error($"Ojojoj... {ex.Message}"); } <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets> <target name="logfile" xsi:type="File" fileName="logs-nlog.txt" /> <target name="console" xsi:type="Console" layout="${longdate}|${level}|${message}" /> </targets> <rules> <logger name="*" minlevel="Trace" writeTo="logfile,console" /> </rules> </nlog>
  • 8. Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.LiterateConsole() .WriteTo.RollingFile("logs-serilog.txt") .CreateLogger(); try { Log.Information("Starting to process..."); var result = ProcessSomething(); if (result > 0) { var debugData = new { Result = result, IsHappy = true }; Log.Debug("Pies1 {@data}", debugData); ProcessMore(); Log.Debug("Pies2"); ProcessWithException(result); Log.Debug("Pies3"); } logger.Trace("Processing ended."); } catch (Exception ex) { Log.Error($"Ojojoj... {ex.Message}"); }
  • 9. Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.LiterateConsole() .WriteTo.RollingFile("logs-serilog.txt") .CreateLogger(); try { Log.Information("Starting to process..."); var result = ProcessSomething(); if (result > 0) { var debugData = new { Result = result, IsHappy = true }; Log.Debug("Pies1 {@data}", debugData); ProcessMore(); Log.Debug("Pies2"); ProcessWithException(result); Log.Debug("Pies3"); } logger.Trace("Processing ended."); } catch (Exception ex) { Log.Error($"Ojojoj... {ex.Message}"); }
  • 11. 11
  • 12. 12
  • 13. Event Tracing for Windows 13
  • 14. Event Tracing for Windows 14
  • 16. "strongly typed (schematized), extensible logging system built into the Windows Operating System" 16
  • 17. 17 Zalety: • Ogromna ilość informacji • Zerowy narzut gdy wyłączony • Mały narzut gdy włączony (~kilka %) • Nieinwazyjne włączanie/wyłączanie • Precyzyjny (analiza wyścigów czasowych) • Silnie typowany • Całkiem niezły “tooling”
  • 18. 18 Zalety: • Ogromna ilość informacji • Zerowy narzut gdy wyłączony • Mały narzut gdy włączony (~kilka %) • Nieinwazyjne włączanie/wyłączanie • Precyzyjny (analiza wyścigów czasowych) • Silnie typowany • Całkiem niezły “tooling”
  • 19. 19 Zalety: • Ogromna ilość informacji • Zerowy narzut gdy wyłączony • Mały narzut gdy włączony (~kilka %) • Nieinwazyjne włączanie/wyłączanie • Precyzyjny (analiza wyścigów czasowych) • Silnie typowany • Całkiem niezły “tooling” PRD
  • 20. 20
  • 22. 22 Timeline Windows 2000 Windows Vista Server 2003 Windows 7 Server 2008 Windows 8 Server 2012 2000 2007 2009 2012 Windows 10 2015 ETW ETW solidnie rozwinięty call-stack przy każdym evencie .NET 2.0 2005 Ulepszenia… .NET 4.0 2010 ETW dla CLR .NET Core 2016 ETW dla CoreCLR
  • 28. 28
  • 29. 29
  • 30. 30
  • 32. 32
  • 33. 33
  • 35. 35 logman query providers logman query providers "Windows Kernel Trace" logman query providers | findstr DotNET logman query providers -pid XXXX
  • 38. 38 Event ETW • Id • Version • Keyword • Level • Opcode • Task • …
  • 39. 39 Przykładowe eventy • Windows KernelProcessStart • Windows KernelProcessEnd • Windows KernelImageLoad – kiedy ładowana jest DLLka • Windows KernelTcpIpRecv – kiedy dociera pakiet TCP/IP • Windows KernelThreadCSwitch - kiedy wątek dostaje albo traci dostęp do CPU
  • 40. 40 logman query providers ".NET Common Language Runtime"
  • 41. 41 Eventy CLR • MSDN (https://msdn.microsoft.com/en-us/library/dd264810(v=vs.110).aspx) • manifest: • CoreCLR .coreclrsrcvmClrEtwAll.man • .NET Framework 4.0+ c:WindowsMicrosoft.NETFramework64v4.0.30319CLR-ETW.man • .NET Framework 2.0 - nie wspierał 
  • 42. 42
  • 43. 43
  • 44. 44
  • 45. 45
  • 48. 50
  • 49. 51
  • 51. 53 Zalety: • przyjemnie graficzny • może posłużyć do tworzenia wykresów Wady: • nie wszystko da się narysować • nie można podejrzeć stacktrace eventów
  • 54. 56
  • 55. 57
  • 56. 58
  • 57. 59
  • 58. 60
  • 59. 61
  • 63. 67 Kiedyś* - żmudne * do 2012 - .NET 4.5
  • 65. 69 class Program { static void Main(string[] args) { while (true) { Console.WriteLine("Enter command:"); string command = Console.ReadLine(); MySampleEventProvider.Log.Command(7, command); } } } sealed class MySampleEventProvider : EventSource { public void Command(long commandId, string Name) { WriteEvent(1, commandId, Name); } public static MySampleEventProvider Log = new MySampleEventProvider(); }
  • 67. 71 using (var session = new TraceEventSession("SimpleMontitorSession", "MyEventsFile.etl")) { var eventSourceGuid = TraceEventProviders.GetEventSourceGuidFromName("MyEventSource"); session.EnableProvider(eventSourceGuid); Thread.Sleep(10000); }
  • 68. 72 using (var session = new TraceEventSession("MyRealTimeSession")) { var providerName = "Microsoft-Windows-DotNETRuntime"; var eventSourceGuid = TraceEventProviders.GetProviderGuidByName(providerName); session.EnableProvider(eventSourceGuid); session.Source.Clr.GCHeapStats += ClrOnGcHeapStats; session.Source.Process(); }
  • 69. Dziękuję za uwagę! Pytania?! 73

Editor's Notes

  • #3: Witam wszystkich serdecznie i bardzo się cieszę, że tutaj dziś Wam opowiadam. Nazywam się Konrad Kokosa i jestem .NET freelancerem I trenerem w swojej DG.
  • #4: Co robicie gdy jest problem (błąd, wydajność, pamięć) na PRD albo na UAT Pokażę Wam extra nardzędzie diagnostyczne – mam nadzieję, że nawet jak już coś o nim wiecie to Wam się przypomni jakie jest fajne
  • #17: Linux dtrace "in the field monitoring/diagnostic"
  • #18: Linux dtrace "in the field monitoring/diagnostic"
  • #19: Linux dtrace "in the field monitoring/diagnostic"
  • #20: Linux dtrace "in the field monitoring/diagnostic"
  • #21: Linux dtrace "in the field monitoring/diagnostic"
  • #23: .NET Core - Dla Linuxa LLTng
  • #27: - PerfMon.exe i Performance Counters - NIE oparte o ETW
  • #31: Cechą charakterystyczną ETW jest operowanie na poziomie providerów, a nie np. procesów. Nie możemy włączyć logowania tylko calc.exe
  • #36: CLR też ma zarejestrowany provider! co oferuje dany PID
  • #37: CLR też ma zarejestrowany provider! co oferuje dany PID
  • #39: Każdy event ETW oprócz unikalnej w ramach providera Id oraz Version posiada również kilka ważnych atrybutów: - Keyword - słowo kluczowe, a tak naprawdę maska bitowa. Dzięki niej eventom może być przypisane jedno lub kilka znaczeń. - Level - poziom logowania. - Opcode - oznacza konkretną akcję (etap) w ramach danego eventu. Najczęściej używany wbudowanymi wartościami jest opcode Start oraz End. - Task - służy do grupowania eventów w ramach providera w pewne zakresy funkcjonalności.
  • #41: CLR też ma zarejestrowany provider! co oferuje dany PID
  • #49: CLR też ma zarejestrowany provider! co oferuje dany PID
  • #50: Windows Performance Recorder i Windows Performance Analyzer
  • #51: Windows Performance Recorder i Windows Performance Analyzer
  • #52: Windows Performance Recorder i Windows Performance Analyzer
  • #53: - przede wszystkim pomyślane jako performance dla .NET (Vance Morrison, Visual Studio performance architect) - Narzędzie to jest używane przez zespół Visual Studio w celu dbania o wydajność tego narzędzia. Jak również przez zespół .NET w celu dbania o wydajność samego frameworku - Jest też napisany tak by rozpoczęcie pracy z nim było banalnie proste. Nie wymaga żadnej instalacji. Jest to po prostu pojedynczy plik wykonywalny - perfview.exe. Dzięki temu możemy go bez problemu użyć na dowolnym komputerze, również serwerach produkcyjnych.
  • #54: Windows Performance Recorder i Windows Performance Analyzer
  • #55: - przede wszystkim pomyślane jako performance dla .NET (Vance Morrison, Visual Studio performance architect) - Narzędzie to jest używane przez zespół Visual Studio w celu dbania o wydajność tego narzędzia. Jak również przez zespół .NET w celu dbania o wydajność samego frameworku - Jest też napisany tak by rozpoczęcie pracy z nim było banalnie proste. Nie wymaga żadnej instalacji. Jest to po prostu pojedynczy plik wykonywalny - perfview.exe. Dzięki temu możemy go bez problemu użyć na dowolnym komputerze, również serwerach produkcyjnych.
  • #56: - posiada potężną pomoc, właściwe każda opcja i element GUI jest linkiem prowadzącym do dokumentacji - przy konkretnym evencie Open Any Stack - pokazuje jego stackview - automatycznie resolvuje symbole JITted kodu zarządzalnego - oparty głównie na ETW ale również na: - The ETWCLrProfiler dlls that allow PerfView intercept the .NET Method calls (see .NET Call in the collect dialog)
  • #57: - posiada potężną pomoc, właściwe każda opcja i element GUI jest linkiem prowadzącym do dokumentacji - przy konkretnym evencie Open Any Stack - pokazuje jego stackview - automatycznie resolvuje symbole JITted kodu zarządzalnego - oparty głównie na ETW ale również na: - The ETWCLrProfiler dlls that allow PerfView intercept the .NET Method calls (see .NET Call in the collect dialog)
  • #58: - posiada potężną pomoc, właściwe każda opcja i element GUI jest linkiem prowadzącym do dokumentacji - przy konkretnym evencie Open Any Stack - pokazuje jego stackview - automatycznie resolvuje symbole JITted kodu zarządzalnego - oparty głównie na ETW ale również na: - The ETWCLrProfiler dlls that allow PerfView intercept the .NET Method calls (see .NET Call in the collect dialog)
  • #59: - posiada potężną pomoc, właściwe każda opcja i element GUI jest linkiem prowadzącym do dokumentacji - przy konkretnym evencie Open Any Stack - pokazuje jego stackview - automatycznie resolvuje symbole JITted kodu zarządzalnego - oparty głównie na ETW ale również na: - The ETWCLrProfiler dlls that allow PerfView intercept the .NET Method calls (see .NET Call in the collect dialog)
  • #60: - posiada potężną pomoc, właściwe każda opcja i element GUI jest linkiem prowadzącym do dokumentacji - przy konkretnym evencie Open Any Stack - pokazuje jego stackview - automatycznie resolvuje symbole JITted kodu zarządzalnego - oparty głównie na ETW ale również na: - The ETWCLrProfiler dlls that allow PerfView intercept the .NET Method calls (see .NET Call in the collect dialog)
  • #61: - posiada potężną pomoc, właściwe każda opcja i element GUI jest linkiem prowadzącym do dokumentacji - przy konkretnym evencie Open Any Stack - pokazuje jego stackview - automatycznie resolvuje symbole JITted kodu zarządzalnego - oparty głównie na ETW ale również na: - The ETWCLrProfiler dlls that allow PerfView intercept the .NET Method calls (see .NET Call in the collect dialog)
  • #62: - posiada potężną pomoc, właściwe każda opcja i element GUI jest linkiem prowadzącym do dokumentacji - przy konkretnym evencie Open Any Stack - pokazuje jego stackview - automatycznie resolvuje symbole JITted kodu zarządzalnego - oparty głównie na ETW ale również na: - The ETWCLrProfiler dlls that allow PerfView intercept the .NET Method calls (see .NET Call in the collect dialog)
  • #63: - przede wszystkim pomyślane jako performance dla .NET (Vance Morrison, Visual Studio performance architect) - Narzędzie to jest używane przez zespół Visual Studio w celu dbania o wydajność tego narzędzia. Jak również przez zespół .NET w celu dbania o wydajność samego frameworku - Jest też napisany tak by rozpoczęcie pracy z nim było banalnie proste. Nie wymaga żadnej instalacji. Jest to po prostu pojedynczy plik wykonywalny - perfview.exe. Dzięki temu możemy go bez problemu użyć na dowolnym komputerze, również serwerach produkcyjnych.
  • #68: kiedyś - żmudne, trzeba było utworzyć plik manifestu, utworzyć z niego poprzez mc.exe kod, zarejestrować manualnie wevtutil.exe - jedna z przyczyn zerowej popularności?
  • #69: tworzy manifest automatycznie z kodu i załącza go do logu
  • #70: tworzy manifest automatycznie z kodu i załącza go do logu pokazać kod pokazać PerfView logi - sam event jak i ManifestData pokazać CPU Stack
  • #71: tworzy manifest automatycznie z kodu i załącza go do logu
  • #72: tworzy manifest automatycznie z kodu i załącza go do logu
  • #73: tworzy manifest automatycznie z kodu i załącza go do logu
  • #74: Zastrzelcie mnie pytaniami – najlepiej osobiście, żeby się wstydu nie najeść!