Hata ayıklama
- İngilizcesi
- Debugging
- Okunuşu
- dibaging
Günlük kullanımda iki ad da yaygın.
Kısaca
Hata ayıklama, bir programın neden yanlış davrandığını bulma, hatalı kodu saptama ve düzeltme sürecidir; çoğu zaman hata ayıklayıcı adlı bir araç kullanılır.
Hata ayıklama (debugging) nedir?
Hata ayıklama, yazılımın çökmesine, yanlış sonuç vermesine ya da beklenmedik davranmasına yol açan hataları (bug) izleyip düzeltme işidir. Genellikle bir döngü izler: sorunu güvenilir biçimde yeniden üret, nerede oluştuğunu daralt, nedeni hakkında bir hipotez kur, onu test et, düzeltmeyi uygula ve başka hiçbir şeyi bozmadan sorunun gittiğini doğrula.
Geliştiriciler birkaç teknik kullanır. En basiti, program çalışırken değerleri görmek için print ya da log ifadeleri eklemektir. Hata ayıklayıcı (debugger) ise çalışan bir programı bir kesme noktasında (breakpoint) duraklatmanıza, satır satır ilerlemenize, değişkenleri ve çağrı yığınını incelemenize ve değerlerin değişimini izlemenize olanak tanıyan bir araçtır; tarayıcılar, kod editörleri ve gdb ile Python'ın pdb aracı gibi komut satırı araçlarının hepsi birini sunar. Diğer yaklaşımlar arasında hata mesajlarını ve yığın izlerini dikkatle okumak, kodu başka birine sesli açıklamak (rubber duck debugging olarak bilinir) ve bir hatayı getiren değişikliği bulmak için commit'ler arasında git bisect ile arama yapmak vardır.
Hata ayıklama, bir dedektiflik işine çok benzer: kanıt toplar, şüphelileri elersiniz ve bir açıklama her olguya uyana dek ipuçlarını izlersiniz. En zor hatalar, yarış durumları ve kararsız (flaky) testler gibi tutarlı biçimde yeniden üretilemeyenlerdir; çünkü programı gözlemlemek zamanlamasını değiştirebilir. İyi günlükleme, küçük yeniden üretilebilir test senaryoları ve sürüm kontrolü bunları izlemeyi çok kolaylaştırır.
Hata ayıklama sıklıkla testle karıştırılır. Test, programı beklenen sonuçlara karşı denetleyerek bir şeylerin yanlış olduğunu söyler; hata ayıklama ise neden ve nerede yanlış olduğunu bulur. Başarısız bir test genellikle hata ayıklamanın başlangıç noktasıdır ve düzeltmeden sonra yeni bir regresyon testi aynı hatanın geri gelmemesini sağlar.
Önemli noktalar
- Hata ayıklama, bir hatanın nedenini bulup düzeltmek demektir.
- Önce sorunu güvenilir biçimde yeniden üretin, sonra nerede oluştuğunu daraltın.
- Hata ayıklayıcılar kesme noktalarında duraklamanıza, kodda ilerlemenize ve değişkenleri incelemenize izin verir.
- Test bir şeylerin yanlış olduğunu ortaya koyar; hata ayıklama nedenini açıklar.
- Bir hatayı düzelttikten sonra sessizce geri dönmemesi için bir regresyon testi ekleyin.
Örnek
def average(values):
total = sum(values)
breakpoint() # pauses here and opens the pdb debugger
return total / len(values)
average([]) # ZeroDivisionError: division by zero
# Inside the debugger you can type commands such as:
# p values print a variable (shows [])
# n run the next line
# c continue runningSık sorulan sorular
Hata ayıklama (debugging) sözcüğü nereden gelir?
Mühendisler “bug” sözcüğünü bilgisayarlar var olmadan çok önce donanım arızaları için kullanıyordu. Harvard Mark II ekibinin 1947 tarihli ünlü bir kayıt defteri girdisi, bir rölede bulunan gerçek bir güveyi “bug'ın bulunduğu ilk gerçek vaka” olarak yapıştırılmış hâlde kaydeder ve bu, terimin bilgisayar dünyasında yaygınlaşmasına yardımcı olmuştur.
Kesme noktası (breakpoint) nedir?
Kesme noktası, bir kod satırına koyduğunuz ve hata ayıklayıcıya program o satıra ulaştığında duraklamasını söyleyen bir işarettir. Duraklatılmışken değişkenleri inceleyebilir, sonraki satırlarda ilerleyebilir ve programın tam olarak ne yaptığını görebilirsiniz.
Rubber duck debugging nedir?
Kodunuzu satır satır başka bir kişiye ya da lastik ördek gibi bir nesneye anlatma pratiğidir. Mantığı sözcüklere dökmek çoğu zaman hiçbir araç olmadan hatayı ortaya çıkarır.
İlgili sayfalar
- İstisnaProgramlamanın Temelleri, s. 28İstisna, bir hata oluştuğunda programın normal akışını kesen bir olaydır; kod bunu programı çökertmek yerine yakalayıp ele alabilir.
- Birim TestiTest ve Kalite, s. 4Birim testi, bir fonksiyonun, metodun ya da sınıfın programın geri kalanından yalıtılmış olarak doğru davrandığını doğrulayan küçük ve otomatik bir kontroldür.
- Git BisectSürüm Kontrolü, s. 11Git bisect, commit geçmişinde ikili arama (binary search) yaparak hatayı getiren commit'i, yalnızca birkaç commit'i test ederek bulan Git komutudur.
- Regresyon TestiTest ve Kalite, s. 21Regresyon testi, daha önce çalışan özelliklerin bozulmadığından emin olmak için bir kod değişikliğinden sonra mevcut testleri yeniden çalıştırma pratiğidir.
- LoglamaDevOps ve Bulut, s. 32Loglama, çalışan bir programdaki hata ve istek gibi olaylar hakkında zaman damgalı mesajlar kaydetme pratiğidir; insanlar bunları sonradan inceleyebilir.
- GözlemlenebilirlikDevOps ve Bulut, s. 22Gözlemlenebilirlik, çalışan bir yazılım sisteminin içinde olup biteni log, metrik ve trace verilerini toplayıp analiz ederek anlayabilme yeteneğidir.
- IDEProgramlamanın Temelleri, s. 25IDE (tümleşik geliştirme ortamı), bir kod editörünü hata ayıklayıcı, derleme komutları ve diğer geliştirici araçlarıyla tek bir yerde birleştiren uygulamadır.
- Stack traceProgramlamanın Temelleri, s. 51Stack trace, bir hata oluştuğu anda devam eden fonksiyon çağrılarının listesidir; hatanın çıktığı satırdan programın başladığı yere kadar uzanır.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin