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