Visual Studio’da hata ayıklama için az bilinen 7 araç

Visual Studio hata ayıklayıcı, uygulamanızdaki sorunları bulup düzelterek size saatler kazandıran sihirli bir araçtır. Hata ayıklamayı kolaylaştıran araçlarla dopdoludur… Elbette var olduklarını ve nerede bulacağınızı biliyorsanız!

1. Set Next Statement’a (Sonraki Deyimi Ayarla) tıklayın

Belki sarı oku (yönerge işaretçisi) kodun hedef satırına taşıyan, ‘Set Next Statement’ bağlam menüsü öğesini (Ctrl+Shift+F10) birçoğunuz biliyorsunuzdur. Taşımak için sarı oku tutup cilt payında aşağıya ve yukarıya sürükleyebileceğinizi de biliyor olabilirsiniz. Ama büyük olasılıkla Visual Studio 2017 sürüm 15.3 Önizlemesi ile başlayarak bir satırı hedeflemenin ve ‘Set Next Statement’ın daha kolay bir yolu olduğunu bilmiyorsunuzdur.

  1. Sarı oku taşımak istediğiniz yerdeki kod satırının üstüne gidin.
  2.  CTRL tuşunu basılı tutun; Run to Click (Yürütme işlemini burada çalıştır) karakterinin Set Next Statement glyph’ine (karakterine) değiştiğini göreceksiniz.
  3. Bu glyph’e tıkladığınızda sarı ok bu satıra taşınacaktır.
  4. Bir sonraki adıma geçildiğinde veya Devam Et (F5) düğmesine basıldığında yürütülecek sonraki deyim bu satır olacaktır.

 2. Değer değiştiğinde kes

Hata ayıklama sırasında bir kesme noktasındaki bir nesnenin özelliğini denetleyip, bir sonraki kesme noktasına geldiğinizde ilk kesme noktasının özelliğinin beklenmedik bir biçimde değiştiğini gördüğünüz bir durum oldu mu? Sınıf ayarlayıcısında bir kesme noktası ayarlayabilirsiniz; ancak bu o nesne tipinin her örneğine kesme koyar! Ya ilgilendiğiniz tek bir sorunlu örnekse? C++ kodunda hata ayıklarken, Data Breakpoints (Veri Kesme Noktaları) size yardımcı olabilir. Yönetilen kodda hata ayıklıyorsanız, aramanızı sorunlu alanda sınırlamak için Make Object ID (Nesne Kimliği Yap) ve bir Conditional Breakpoint (Koşullu Kesme Noktası) kullanabilirsiniz.

  1. İlgilendiğiniz örneğin bulunduğu kesme noktasına geldiğinizde, nesneye sağ tıklayıp Make Object ID’yi seçin. Bu size “$1” referansıyla bellekteki o nesneye bir tanıtıcı verecektir.
  2. İlgilendiğiniz özelliğin ayarlayıcısına gidin ve “condition to the breakpoint” (kesme noktası için bir koşul) ekleyin
    “bu == $1”
  3. Devam Et (F5) düğmesine bastığınızda, bu örnek için özellik değiştiğinde ayarlayıcıda kesme oluşturursunuz.
  4. Call Stack’e (Çağrı Yığını) bakın ve önceki çerçeveye çift tıklayın. Bu sizi, bu belirli nesne örneği için özelliği değiştiren kod satırına götürecektir.

Not: Nesne Kimliği, nesnenin bellekteki adresine işaret ettiği için sonuçta her yeni hata ayıklama oturumuyla değişecektir. Onun için, hata ayıklama işlemini yeniden başlatmanız gerekiyorsa, sağ tıklayıp nesne kimliğini yeniden oluşturduğunuzdan emin olun. Tanıtıcı ($1) değişmeyeceği için hata ayıklama oturumları arasında kesme noktanızı olduğu gibi bırakabilirsiniz.

3. Reattach to Process (İşleme Yeniden İliştir)

Bu, Visual Studio 2017 ile sunulan ve birçoğunuzun keşfetmesi gereken gerçek bir zaman kazandırıcı. “Attach to Process” kullanmanız gereken bir proje üzerinde çalışıyorsanız, ama kendinizi arka arkaya oturumlarda sürekli olarak aynı şeye iliştirirken buluyorsanız, son derece faydalıdır.

  1. Attach to Process diyalog kutusundan (Ctrl+Alt+P) başlayın; hata ayıklamak istediğiniz işlem veya işlemleri seçip Attach’e (İliştir) tıklayın.
  2. Bu hata ayıklama oturumunu sonlandırdığınızda, araç çubuğunda Debug (Hata Ayıkla) menüsüne gidin.
  3. Reattach to Process’e (İşleme Yeniden İliştir) tıklayın veya kısayol tuşunu (Shift +Alt+P) kullanın.

Reattach to Process hakkında daha ayrıntılı bilgi için bu blog yazısına bakabilirsiniz.

 4. Show Threads in Source (Kaynaktaki İş Parçacıklarını Göster)

Multithreaded (çok iş parçacığından oluşan) bir uygulamada hata ayıklama ender olarak kolaydır, ama editor’de (düzenleyici) her bir iş parçacığının hangi kod satırında olduğunu görebildiğinizde çok daha kolaylaşır.

  1. Hata ayıklayıcı araç çubuğunda Show Threads in Source (Kaynaktaki İş Parçacıklarını Göster) düğmesini açın.
  2. O anda en az bir iş parçacığının durdurulmuş olduğu her kod satırının yanındaki kesme noktası cilt payında bir glyph (karakter) görünecektir.
  3. Bir kod satırında o anda durdurulmuş olan tüm iş parçacıklarının thread id’leri (parçacık kimlikleri) ve adlarını görmek için iş parçacığı işaretleyici simgesinin üstüne gidin.
  4. Freezing (dondurmak) ve active thread’e (etkin iş parçacığı) geçmek gibi yapabileceğiniz eylemleri görmek için active thread’e sağ tıklayın.

Not: Bu işlevsellik, performansa bazı yükler getirir ve hata ayıklamayı yavaşlatır gibi görünebilir. Etkin olarak kullanmadığınızda kapatmanızı öneririz.

5. Çok fazla gezinmeden tek bir iş parçacığını adımlayın

Multithreaded code’da (çok iş parçacığından oluşan kod) hata ayıklarken ilk kesme noktasına geldiğinizde, bir adım attığınızda, birdenbire başka bir iş parçacığındaki sarı okun sizi durdurduğu durumu ne kadar sık yaşarsınız? Beklenmedik davranış, halen ayarlanmakta olan ve sonucunda isabet edilen breakpoint’ten (kesme noktası) gelir. Varsayılan olarak hata ayıklayıcı her isabet ettiği kesme noktasında duracaktır. Bu, bir adımı uyguladığınızda tüm iş parçacıklarının çalışmasına izin verildiği ve çalışan iş parçacıklarınızdan birinin adımınız geçerli iş parçacığınıza gelmeden bir kesme noktasına isabet ettiği demektir. Bir daha böyle bir durumla karşılaşırsanız şunu deneyin:

  1. Ddebugger’ın (hata ayıklayıcı) geçtiği yeni thread’in (iş parçacığı) isabet ettiği breakpoint’i (kesme noktası) devreden çıkarın ya da silin.
  2. Devam Et (F5) düğmesine basın.
  3. Bu ilk iş parçacığınızda başlangıçtaki ilk adımınızın tamamlandığını ve şimdi hata ayıklamanın etkin bağlamı olduğunu göreceksiniz.
  4. Kesme noktalarınız devre dışı bırakıldığı ya da silindiği için, kesintiye uğramadan bu tek iş parçacığını adımlamaya devam edebilirsiniz.

 

6. Debug.ListCallStacks -allThreads

Çok sayıda iş parçacığı olduğunda, ayarlanması gereken çok sayıda çağrı yığını olabilir. Uygulamanızın durumunu iyi anlamak için bunların hepsini incelemeniz gerekebilir. Parallel Stacks (Paralel Yığınlar) penceresini kullanarak (Debug/Windows/ Parallel Stacks), her iş parçacığı için call stack’in (çağrı yığınları) görsel gösterimini her zaman görebilirsiniz. Command window’u (komut penceresi) kullanarak her iş parçacığı için çağrı yığınını kopyalanabilir/yapıştırılabilir, metin tabanlı olarak da görebilirsiniz.

  1. Command window’u (komut penceresi) açın (View/Other Windows/Command Window).
  2. “Debug.ListCallStacks – allThreads” yazın.
  3. Sık kullanılan “~*k” WinDBG komutunu da kullanabilirsiniz.
  4. Pencerede her iş parçacığının çağrı yığınıyla birlikte listelendiğini göreceksiniz.

 

7. Side Effect Free Function Evaluation “, nse” (Yan Etkisiz İşlev Değerlendirmesi “, nse”)

Watch window (gözcü penceresi) veya Immediate window’a (komut penceresi) masumca bir expression (ifade) girip, sonra istemeden uygulamanın durumunu değiştirdiğiniz için hata ayıklama oturumunun yan etkileriyle uğraşmanız gerektiği hiç oldu mu? Bu, çoğunlukla, programınızda bir işlevi çağıran bir ifadeyi değerlendirmeye çalışırken olabilir ve side effect yani yan etkilere (uygulamanın kendisini çalıştırmadan programda durum değişikliklerine) yol açar. Hangi işlevlerin çağrılacağını biliyorsanız sorun olmayabilir, ama ya emin değilseniz? Yan etkilerin programınızı bozma riski olmadan C#’de ifadeleri değerlendirmenin bir yolu:

  1. Watch window (Gözcü penceresi) veya Immediate window’a (Komut penceresi) yazdığınız herhangi bir ifadenin arkasına “, nse” (“Yan Etki Yok” anlamındadır) ekleyebilirsiniz.
  2. Bu, herhangi bir yan etkiye neden olmadan ifadeyi yorumlayan bir tür bir koruma alanı kullanacaktır.
  3. İfade yorumlanamıyorsa ve ancak değerlendirmeyle çözülebiliyorsa, pencerede bir hata mesajı gösterilecektir.
  4. Her durumda değerlendirmek istediğinizden eminseniz, “, nse” modifier’ı (değiştirici) kaldırıp tekrar deneyin.