Debugging - Teknik Metodlar

Hata ayıklama manuel olarak yapılan, mantıksal problemlerin çözümü gibi yoğun ve programlamadan daha can sıkıcı bir iştir. Detaylı araçların yardımı çok az olacaktır ve onların yerine zekice uygulanan az miktardaki tekniklere başvuracaksınız.

İzleme(trace) İfadeleri Koyun

Bu kullandığım en temel bir hata ayıklama metodudur. Trace ifadesi hata içerdiği sanılan kod parçasına eklenen log mesajıdır. Tabi hata bulundukta sonra bu mesaj silinir. Trace ifadeleri sadece kodun nasıl çalıştığını izlemek için değil aynı zamanda program boyunca kullanılan değişkenlerin durumunu izlemek için de kullanılır. İyi seçilmiş trace ifadeleri ile hatanın sebebini tam olarak belirlemek genellikle çok az zaman alır. Hatayı bulduktan sonra konsol mesajlarını dosya tabanlı mesajlara çevirmek ilerdeki hata ayıklama işleri için yardımcı olabilir.

3. Parti Ürünlerin Log Dosyalarına Başvurun

Eğer 3. parti bir uygulama sunucusu, sunucu yazılımı, veritabanı yazılımı yada komponent kullanıyorsanız, bu yazılımların kendi log dosyalarında en son karşılaşılan hatalarla ilgili kullanışlı bilgilere ulaşabilirsiniz. Belki komponentin istediğiniz çeşit bilgilerin kaydını tutması için konfigurasyonunu yapmak durumunda kalabilirsiniz. Genel olarak eğer karşılaştığınız hatanın, kodlarına sahip olmadığınız bir 3. parti yazılımdan kaynaklandığını düşünüyorsanız (tabi içine trace ifadeleri de koyamayacaksınızdır eğer öyleyse), bu durumda üreticinin size ürünün arka planda gerçekleşen işlemlerle ilgili bilgi sağladığı bir yol olup olmadığını öğrenin. Örneğin bir ORM kütüphanesi (ORM library), hiçbir log çıktısı (output) üretmese de konfigurasyon dosyası veya komut satırı (command line) ile veritabanına gönderilen tüm SQL ifadelerinin çıktısını verebilir.

Hata Mesajını Web'de Aratın

Hata mesajını aynen kopyalayarak istediğiniz bir web arama motorunda aratın. Böylece, yöneltilen sorularda hata mesajının aynen sorunun içinde geçtiği tartışma forumlarından sonuçlar getirilecektir ki yazılan cevaplardan biri de sizin hatanızla ilgili olabiilr. Webde ayrıca hata numarasını da aratabilirisiniz.

En Başından Tekrar Başlayın

Bazan bir hatayı uzunca süre araştırdıktan sonra onu bulmak konusunda umutsuzlaşırsınız. Daha bakmanız gereken biton kaynak vardır veya araştırdığınız durum/davranış biraz tuhaf ve alışılmadık olabilir. Böyle durumlarda en başından tekrar başlamak faydalı olabilir. Fonksiyonu sizin hatanızın yerini göstermek olan bütünüyle yeni ve küçük bir uygulama oluşturun. Eğer böyle demo bir programcık yazabilirseniz, hatanızın sebebinin izini sürmekte doğru yoldasınız demektir. Hataya sebep olan potansiyel komponentleri birbir deneyerekten demo programınızı hatadan izole edilmiş hale getiriniz. Örneğin demo programınız database connection pooling kütüphanesi kullanıyorsa, bu komponenti çıkarın ve tekrar deneyin. Hata hala devam ediyorsa hatalı davranışın sebebi olmayan komponentlerden birini tespit ettiniz demektir. Bu usulde ilerleyerek hatayı kaybeden bir komponenti çıkarttığınızda işte bu komponent, son çıkardığınız, hataya sebep oluyordur.

Süreksiz Hatalar

Aralklı olarak ortaya çıkan ve sürekli oluşmayan hatalar programcı için talihsizliktir. Bunlar genelde ortak kaynakların asenkron(asynchronous) kullanımından olabileceği gibi aynı memory alanını kullanan multiple thread'lerden yada lokal bi değişkene aynı anda ulaşmaya çalışan fonksiyonlardan olabilir. Ayrıca farklı uygulamaların aynı memory yada IO kaynaklarını kullanmasından da kaynaklanabilir.

İlk olarak paralel olarak çalışan işlemlerin seri halde çalışmasını sağlayın. Örneğin n tane hesaplama için n tane thread yerine n tane hesaplamayı seri olarak yaptırın. Eğer hata kaybolursa hesaplamayı yapan kod parçalarında senkronizasyon probleminiz var demektir. Thread'lerin senkronizasoynunu düzeltemezseniz multi-thread çalışan 3. parti bir kütüphane deneyin.

Eğer programlama diliniz değişkenlerin ilk değerleri ile ilgili garanti vermiyor ise, ilk değer verilmeyen değişkenler de süreksiz meydana gelen bug'ların sebebi olabilir. Yüzde 99 değişken 0 veya null ile başlatılır. Fakat diğer yüzde 1 ihtimal rastegele bir ilk değer alır ve hataya neden olur. System Purterbers tipi yazılımlar bu tarz problemlerin izini sürmede yardımcı olabilir. Böyle araçlar sıfır olan memory alanları ile işlem yapmaya yada memory alanını rastgele data ile doldurmaya yarar.

Hatayı Doğru Yerde Arayın

Araştırmalar göseriyorki bug'lar birlikte kümelenme eğilimindedir. Bundan dolayı yeni bir bug ile karşılaştığınızda, daha önce çözdüğünüz bug'ların yer aldığı kodları gözden geçirin veya bu bug'ın çevresindeki kod parçasını inceleyin.

Doküman Okuyun

Eğer diğer hepsinden sonuç çıkmaz ise talimatlara başvurun. Programcılar yeni bir API kullanırken deneme yanılma ile hareket ederler. API ile ilgili dokümantasyon yok ise bu uygun bir yöntem olabilir. Fakat API programcı için düşük seviye dokümantasyona sahip ise okumak için biraz zaman ayırmakta fayda var. Karşılaştığınız bug'ın API'nin yanlış kullanımından yada gerekli önşartlara uymadığınızdan kaynaklanmış olması muhtemeldir.

Tekrar Compile Edin

Mide bulandırıcı hata tiplerinden birisi de çeşitli compile(derleme) işlemlerinden sonra oluşan .exe ile ortaya çıkar. Bu hatalı davranış oldukça gariptir.

En son böyle bir hata ile Java kodları içindeki constant string tipindeki değişkenlerin değerlerini değiştirdiğimde karşılaşmıştım. Sanki compiler(derleyici) referans noktasında string tipindeki sabitleri(constant) literal olarak ekleyerek optimizasyon yapıyordu. Böylece constant değer herbir class dosyasına kopyalanıyordu. Eğer constant string değeri değiştirdikten sonra bu class dosyalarını regenerate etmez iseniz, bu class dosyaları constant değişkenin eski değerini içerecektir. Fakat tam bir derleme işlemi bunun oluşmasını engelleyecektir. Son olarak derleyicinin debug bilgisini çalışma zamanında göstermesini ve warning seviyesini maximum'da ayarlayın.

Sınır Noktalarına ve Özel Durumlara Bakın

Tecrübeli programcılar algoritma kurarken hatalara neden olabilecek uç noktaları da düşünürler. Örneğin 1 den N'e kadar tüm kayıtları silmek ile 0 noktasındaki kaydı silmek farklıdır. Artık bir yılı belirlemek yılın 400 ile bölünebilir olması farklıdır. Bir string ifadesindeki kelimeleri boşluklarla ile ayırırken, string ifadesinin sadece tek bir kelimeden oluştuğu veya null değer aldığı durumlar vardır. Genel koşullara göre kodlamak ve özel durumları unutmak çok yaygın hata sebebidir.

Kaynağı belirsiz olan birçok hata 3. parti yazılımların versiyonlarının uyumsuz olmasından kaynaklanır. Bu tabi diğer debug tekniklerini denedikten sonra kontrol edilecek son şeydir. Eğer bir kütüphanenin 1.0.2 versiyonu diğer bir kütüphanenin 2.4 versiyonuna bağımlı ise ve siz onun yerine 2.5 versiyonuyla çalışıyorsanız, sonucu teşhisi imkansız yada zor ince hatalar olabilir. Bu durumda hatanın ortaya çıktığı en son kütühenyi bir önceki kullandığınız ile upgrade etmeyi düşünebilirsiniz.

En Son Değiştirdiğiniz Kodu Kontrol Edin

Herhangi bir anda herhangi bir fonskiyonda aniden bir hata ortaya çıkarsa, bunun sebebinin en son değiştirdiğiniz kod parçasından kaynaklanacağını düşünmelisiniz. Bu tür durumlarda version source control sisteminiz devreye girer ve kodun tarihçesine göz atmanızı sağlar.

Hata Mesajına Her Zaman Güvenmeyin

Nomalde hata mesajlarını dikkatle irdelersiniz, acaba bir ipucu varmı diye umarsınız. Bu yaklaşımla bir sonuca varamıyorsanız hata mesajlarının bazan yanlış yönlendirdiğini hatırlayın. Bu durumlarda hata mesajını birebir çevirmekten kaçınmak ve diğer ihtimalleri düşünmek gerekir.

Grafiksel Buglar

GUI(Graphical User Interface) ile veya grafiksel bug'lar üzerinde çalışırken kullanacağınız birkaç teknik vardır. Kullandığınız grafik pipeline debug mod destekliyormu diye kontrol ediniz; bu modda grafiksel işlemlerin hızı birbir gözlemleme yapabileceğiniz şekilde çalışır. Bu mod seri halde çalışan grafiksel uygulamaların beklediğiniz etkiyi verip vermediğini belirlemek için kullanışlı bir yoldur.

Kontrollerin yerleşimleriyle ilgili problemleri debug ederken panellerin ve komponentlerin arkaplan renklerini koyu ve yoğun renklere set ederim. Bu komponentin sınırlarını görmeyi sağlar.

Konuyla ilgili diğer başlıklar;

Debugging (Hata Ayıklama)

Genel Prensipler

Teknik Metodlar (şuan burdasınız)

Psikolojik Metodlar

Hata Önleme Yöntemleri

Sonuç

Yorum yapabilirsiniz

Adınız  


E-Posta  


Yorumunuz