Perfview ile wt ("watch and trace") çıktı analizi
Daha önceki bir yazımda "Perfview" uygulamasını tanıtmış, ve performans incelemeleri için nasıl kullanılabileceğini ele almıştım. Perfview, sistemde çalışan process ve thread'ler üzerinden belirli aralıkla "Callstack" sample'ları toplayarak hangi çağrıların daha çok zaman aldığını belirlememizi sağlıyor. Bunun yanısıra, ".net heap" analizi, event analizi vs. gibi farklı analiz tiplerine de olanak sağlamakta.
Perfview uygulaması, ".NET Runtime, Architect" ekibinden "Vance Morrison" tarafından yazıldı. Uygulama ile ilgili her türlü gelişme ve yeniliği takip etmek için "Vance Morrison"un kişisel blog'unu takip edebilirsiniz. Ayrıca gine "Channel9" üzerinde de pekçok faydalı video mevcut.
Sizlere bu yazımda geçenlerde keşfettiğim bir özellikten bahsetmek istiyorum. Bu özelliği "help" dosyasını incelerken tesadüfen farkettim. Genellikle "Windbg" üzerinden bir process'e bağlı, "debugging" yaparken "wt" ("watch and trace") komutunu fonksiyonların birbirlerini nasıl çağırdığını görmek ve iş mantığını anlamak, hangi aşamada hata alındığını tespit etmek gibi pek çok farklı nedenden kullanıyoruz. Öncelikle ilgilendiğimiz fonksiyonu üzerine bir "breakpoint" koyup, bu breakpoint'e gelindiğinde komutu çalıştırarak o fonksiyonun hangi fonksiyonları nasıl çağırdığını görebiliyoruz. Aşağıda örnek bir çıktı mevcut:
0:000> wt
Tracing MyModule!myFunction to return address 00401137
105 0 [ 0] MyModule!myFunction
1 0 [ 1] MyModule!ILT+1555(_printf)
9 0 [ 1] MyModule!printf
1 0 [ 2] MyModule!ILT+370(__stbuf)
11 0 [ 2] MyModule!_stbuf
1 0 [ 3] MyModule!ILT+1440(__isatty)
14 0 [ 3] MyModule!_isatty
50 15 [ 2] MyModule!_stbuf
17 66 [ 1] MyModule!printf
1 0 [ 2] MyModule!ILT+980(__output)
59 0 [ 2] MyModule!_output
39 0 [ 3] MyModule!write_char
111 39 [ 2] MyModule!_output
39 0 [ 3] MyModule!write_char
....
11 0 [ 5] kernel32!__SEH_epilog4
54 11675 [ 4] kernel32!ReadFile
165 11729 [ 3] MyModule!_read
100 11895 [ 2] MyModule!_filbuf
91 11996 [ 1] MyModule!fgets
54545 83789 [ 0] MyModule!myFunction
1 0 [ 1] MyModule!ILT+1265(__RTC_CheckEsp)
2 0 [ 1] MyModule!_RTC_CheckEsp
54547 83782 [ 0] MyModule!myFunction
Eğer "wt" çıktısını ( "105 0 [ 0] MyModule!myFunction" satırlarının olduğu) bir text dosyasına "*.wt" uzantısı ile kaydedersek bu uzantıyı "Perfview" uygulaması tanıyabilmekte. Ve ilgili fonksiyon çağrılarını "Perview" uygulamasının "Stack Viewer" ekranında inceleyebiliriz. Daha da güzeli; iki farklı "wt" çıktısını menü üzerindeki "Diff" özelliği ile de karşılaştırabilmekteyiz:
Umarım bu özellik performans analizlerinizde faydalı olur.
İyi çalışmalar,
Mert