Visual Studio ile Hata Ayiklama

Visual Studio ile Hata Ayiklama
Yazının orijinaline blogumdan ulaşabilirsiniz.

Abi bu kod niye çalışmıyor???
    – Anonim Yazılımcı

"Unity’nin bu versiyonu buglı, yoksa burası kesin true!"
    – Suçunu kabullenmeyen anonim yazılımcı

Eminim ki hepiniz bunun gibi cümleleri birçok defa kurmuşsunuzdur veya sık sık kuruyorsunuzdur. Yalan söylemenin, inkar etmenin lüzumu yok, biz bizeyiz burada. Yeni başlayanlarınız şaşırabilir belki ama hemen hemen her yazılımcı vaktinin çok büyük bir oranını debug, yani kodun hatalarını bulup düzeltmeye harcar.

Hataların sebeplerini araştırırken genellikle ya bir değişkenin değerini öğrenmek, ya da kodun belirli bir fonksiyonu çağırıp çağırmadığını görmek isteriz. Bunun için akla gelen ilk yöntem print(), Debug.Log() veya Console.Write() gibi fonksiyonlardan faydalanıp belirli çıktıları konsola yazdırmak. Bu yöntem gerçekten de yer yer çok işe yarıyor. Peki kodun çalışmasını satır satır takip etsek, bu esnada her değişkenin değerini görsek, hatta istersek her değişkenin değerini değiştirebilsek güzel olmaz mı? Olur tabi. Aynı şeyi çok uzun zaman önce zeki abiler ve ablalar da düşünmüş olmalı ki kullanmamız için tam olarak bu işi yapan bir takım debug araçları geliştirmişler.

Bu yazıda bu araçları Visual Studio 2019 ve Unity üzerinden anlatıyor olsam da benzer araçlar hemen hemen her IDE’de mevcut. Mevcut değilse zaten kullanmayın o IDE’yi.

Visual Studio’yu Unity ile birlikte kurduysanız yukarıdaki araçların arasında şuna benzer araç çubuklarını görebilirsiniz:

Hata ayıklama çubuğu

Eğer bu araç çubuğunu görmüyorsanız paniklemeyin! Yukarıdaki menülerden Görünüm -> Araç Çubukları -> Hata Ayıklama‘yı ve Standart‘ı aktif edin (View -> Toolbars -> Debug ve Standard).

Bundan sonrası için Unity’de yeni Universal Render Pipeline ile otomatik olarak oluşturulan projedeki SimpleCameraController.cs betiğini (script’ini) kullanacağım. Aynı işlemleri herhangi başka bir script ile de yapabilirsiniz.

Eğer Unity 2020 ve daha sonraki sürümlerini kullanıyorsanız, sağ altta bulunan böceğe benzeyen düğmeye, ardından açılan penceredeki Switch to Debug Mode düğmesine tıklayın. Öyle bir simge görmüyorsanız önemli değil, hayatınıza devam edebilirsiniz.


Unity’de Play düğmesine basıp oyunu başlatalım. Daha sonra Visual Studio’yu açın ve ilgilendiğiniz satırın en soluna tıklayın. Tıkladığınız yerde kırmızı bir nokta oluşacak ve satır kırmızıya dönecektir. Bunu Update() metodunun içinde yapmanız bu aşamada önemli.


Bu kırmızı noktaya Kesme Noktası (Breakpoint) deniyor. Program bu satıra geldiğinde burada duracak anlamına geliyor. Kırmızı noktaya tekrar tıkarsanız kaybolacaktır. Aynı işlemi bir satırı seçtikten sonra F9 düğmesine basarak da yapabilirsiniz. Tabi bu kısayol IDE’den IDE’ye değişiklik gösterecektir. Şimdi hata ayıklama araç çubuğundaki oynat (play) düğmesi gibi görünüen yeşil düğmeye basın.

Hiçbir değişiklik olmadıysa muhtemelen biraz önce bahsettiğimiz Unity’deki hata ayıklama modunu açmanız gerekiyor. Unity’ye dönünce şöyle bir uyarı ile karşılaşacaksınız:


Switch to debug mode düğmesine tıklayın. Oyun hala açıksa durdurdurun ve baştan başlatın.

Her şeyi doğru yaptıysanız Visual Studio’daki kırmızı ile işaretlenmiş satırın sarıya döndüğünü ve Unity’yi açamadığınızı fark edeceksiniz. Panik yok! Bu beklenen bir sonuç. Unity’de Play düğmesine bastığımız zaman oyun başladı. SimpleCameraController betiği de sahnede, kameranın üzerinde olduğu için Update() metodu çalışmaya başladı. Sıra bizim kesme noktasını koyduğumuz satıra gelince Visual Studio bunu fark edip Unity’yi duraklattı ve kodun bu satıra geldiğini belirtmek için satırı sarıya çevirdi.

Bu noktada bu betiğin bildiği bütün değişkenleri görebilirsiniz. Örneğin fare imlecini Update() fonksiyonunun dışında tanımlanmış invertY isimli değişkenin üzerine getirin, bir saniye bekledikten sonra değerini gösteren ufak bir pencere göreceksiniz:


Eğer değeri gösteren alan üzerine tıklarsanız o alanı değiştirebileceğinizi göreceksiniz.


Alternatif olarak takip etmek istediğiniz değişkeni Gözcü (Watch) penceresine yazarak takip edebilirsiniz.


Bu pencereyi görmüyorsanız sorun değil, Hata Ayıklama -> Pencereler -> Gözcü menüsünden bu pencereyi açmanız mümkün. Az öncekine benzer şekilde değişkenin değerine tıklayarak değerini değiştirmeniz mümkün.

Kesme noktasının olduğu satıra geri dönelim. Eğer burada işimiz bitti ise ve sonraki kesme noktasına geçmek istiyorsak yine yukarıdaki yeşil butona basabiliriz. Şu anda yanında Devam ya da Continue yazıyor olmalı. Bunu test etmek için birkaç satır altına bir kesme noktası daha koyalım ve Devam dugmesıne basalım (kısayol olarak F5 tuşunu kullanabilirsiniz):





Beklediğimiz gibi kod bir sonraki kesme noktası olan satıra gelene kadar çalışmaya devam etti ve ilgili satırda tekrar durdu. Tekrar devam düğmesine tıklarsanız bir önceki kesme noktasına döndüğümüzü göreceksiniz. Burada olan şu; kod olduğu gibi çalışmaya devam etti ve başka hiçbir kesme noktası ile karşılaşmadığı için durmadı. Bir sonraki karede (frame) Update() fonksiyonu bir daha çağırıldı ve Visual Studio beklendiği gibi ilk kesme noktasını koyduğumuz satıra gelince durdu.

Şimdi eğer bir altındaki Cursor.lockState = CursorLockMode.Locked; satırına bir kesme noktası koyup Devam düğmesine tıklarsanız Visual Studio yeni koyduğunuz kesme noktasını atlayacak ve en alttakinde duracaktır.


if‘in nasıl çalıştığını biliyorsanız bu sizi çok şaşırtmayacaktır. Sağ fare düğmesine tıklamadığımız için if parantezinin içindeki şart sağlanmadı. Dolayısı ile o satır es geçildi ve içindeki kod çalışmadı. Kod çalışmadığı için de Visual Studio orada durmadı.

Bunu daha iyi görmek için baştaki ve sonraki kesme noktalarını kaldırın ve sadece if şartının içindekini bırakın. Devam düğmesine tıklayın.


Şimdi Unity’ye dönebilirsiniz ve oyunun çalışmaya devam ettiğini göreceksiniz. Ancak oyunun içinde sağ fare tuşuna tıkladığınız anda Visual Studio yine Unity’yi kilitleyecek ve kodu bıraktığımız kesme noktasının üzerinde durduracaktır.



Buraya kadar her şey çok güzel. Peki sonraki satıra geçmek istediğimizde her seferinde bir kesme noktası mi koyacağız? Tabi ki hayır! Hata ayıklama araç çubuğundaki üzerinde yarım daire şeklide ok olan noktaya basarsanız kod bir sonraki satıra geçecektir. Alternatif olarak F10 tuşunu kısayol olarak kullanabilirsiniz.


Hata ayıklma işlemimiz bitti ise ya da bir sebepten ötürü durmak istiyorsak araç çubuğundaki kırmızı Dur (Stop) düğmesine, ya da SHIFT + F5 tuşlarına basarak bu işlemi durdurabiliriz.


Bir örnek daha yapalım. Bunun için Update fonksiyonunun dışına ufak bir fonksiyon daha ekleyelim:

private void QuickExample()
{
    Debug.Log("We are here!");
}​

Bunu az önceki iki if ifadesinin arasında çağırıp bir önceki if ifadesine kesme noktası koyacağım:
 

Oyunu durdurmadıysanız durdurup tekrar başatın ki yeni yaptığımız değişiklikler derlensin.

Yukarıdaki Oynat görünümlü düğmeye, ya da kısayol olan F5‘e basarak hata ayıklama işlemine tekrar başlayın. Kesme noktasından F10‘a basarak satırları atlayarak devam edin.

QuickExample(); satırına gelince yine F10 ile satır atlayın. Dikkat ederseniz fonksiyonun içinden devam etmek yerine kod direk bir sonraki if satırına geçti. Bu da aslında beklediğimiz bir davranış. QuickExample() fonksiyonu çalışmış olsa da bir sonraki satıra atlamak için kullandığımız düğmenin adı Step Over. Kabaca Üstünden Geç şeklide çevirilebilir. Bu düğme ile her satırın üstünden geçiyor ve hiç içine girmiyoruz.

Peki nedir bunun çaresi? Step Over düğmesinin komşusu Step Into düğmesi. Bu düğmenin simgesi noktayı gösteren bir ok, kısayolu da F11. F5‘e basarak ilk kesme noktasına dönün, F10 ile QuickExample(); satırının üzerine gelin ve F11‘e ya da araç çubuğundaki düğmeye basın. Sarı satırın fonskiyonun içine girdiğini göreceksiniz.


Son olarak Çağrı Yığını (Call Stack) penceresine bakalım. Eğer bu pencereyi görmüyorsanız her zamanki gibi Hata Ayıklama -> Pencereler menüsünden bulup aktif edebilirsiniz.


Bu pencere şu anda bulunduğumuz satıra hangi fonksiyondan geldiğimizi gösteriyor. Şu anda olduğumuz satır sarı ok ile gösteriliyor. Bir alttaki satıra çift tıklarsanız Visual Studio sizi fonksiyonun çağrıldığı satıra götürecektir:


Evet, Visual Studio’da hata ayıklama kabaca bu şekilde özetlenebilir. Tabi ki daha birçok değişik ve faydalı özellik var, ancak en çok kullanılan ve en temelleri bunlar. Bu özellikleri kullarak hataları çok daha hızlı ve efektif bir şekilde tespit edip çözebilirsiniz!
Yorumlar