Konu Anlatımı
Hata Ayıklama Neden Önce Ölçüm İstiyor?
Bir program beklenenden farklı davrandığında ilk iş geriye dönüp sorunu kanıtla bulmaktır. Rastgele değişiklikler yapmak, hatayı gizleyebilir ya da yeni hatalar doğurabilir. Bu yüzden hata ayıklama bir süreçtir: belirti, kanıt, varsayım, deneme ve doğrulama adımları.
Belirti, davranışın gözlenmesidir. Kanıt, ölçümdür. Varsayım, kanıta dayanan açıklamadır. Her deneme sonrası ölçüm tekrarlanır; böylece ilerleme kanıtla gösterilir.
Konsol Araçları
Tarayıcı geliştirici araçlarındaki konsol, değerleri yazdırmanın yanı sıra nesne ağaçlarını, veri türlerini ve hata yığınlarını göstermek için kullanılır. Değerleri tablo hâlinde yazdırmak, iç içe dizileri okunur biçimde görmeyi sağlar.
- Değişken yazdırma, değerin o anki hâlini kanıtlar.
- Tablo biçimi, iç içe dizi ve nesneleri katman katman gösterir.
- Grup yazdırma, ilgisiz değerleri gizleyerek okunurluğu artırır.
Adım Adım İlerleme
Hata ayıklama noktası, kodun belirli bir satırında durulmasını sağlar. Durulduğunda çağrı yığını, kapsamdaki değişkenler ve o satırdaki değerler incelenebilir. Adım adım ilerleme, hatanın hangi satırda başladığını bulmanın en güvenilir yoludur.
Devam et komutu bir sonraki satıra geçer, adım atla ise o satırdaki fonksiyonu çalıştırıp bir sonraki ifadeye geçer. İç içe çağrılarda çağrı yığını en üstteki çerçeve, hatanın doğduğu yeri gösterir.
Yeniden Üretme ve İzolasyon
Bir hatayı düzeltmek için önce güvenilir biçimde yeniden üretilebilir hâle getirmek gerekir. Veri, adım sayısı ve ortam sabitlendikçe hata izolasyonu kolaylaşır.
İzolasyon, sorunun hangi parçada olduğunu bulma çalışmasıdır. Kodun yarısını geçici olarak devre dışı bırakmak ya da yorum satırına çevirmek, darboğazı hızla işaret eder. Bulunan parça yeniden etkinleştirildikçe sorumluluk daralar.
Profil Analizi
Performans profillemesi, kodun hangi bölümünün zaman harcayıp hangisinin azaldığını gösterir. Kayıt alındıktan sonra en pahalı çağrılar sıralanır ve darboğaz üzerinde çalışılır.
Bellek profillemesi ise ayrılan nesnelerin neden toplanmadığını gösterir. Olay dinleyicileri kaldırılmadan çalışan uygulamada ayırma işlemi hiç gerçekleşmeyebilir; bu, uzun süreli kullanımda yavaşlamaya yol açar.
Düzeltmeyi Doğrulama
Düzeltme bittiğinde yalnızca hatanın kaybolduğu değil, başka bir yolun bozulmadığı da denetlenmelidir. Aynı senaryo düzeltme öncesi ve sonrası ölçülüp karşılaştırılır. Değer beklenenden iyiye giderse düzeltme kalıcıdır; yalnızca belirti kaybolduysa sorun başka bir yere taşınmış olabilir.
──YAMA── hata-turleri-ve-izolasyon
Hata Türlerini Sınıflandırmak
Hata ayıklamaya başlamadan önce hatayı türüne göre sınıflandırmak, arama alanını baştan daraltır. Üç temel tür vardır.
| Hata Türü | Ne Zaman Ortaya Çıkar | Nasıl Anlaşılır | İlk Yapılacak |
|---|
| Sözdizimi hatası | Kod derlenmeden önce | Konsolda parse hatası, satır numarası verilir | Hatalı satırda parantez, virgül veya noktalama denetimi |
| Çalışma zamanı hatası | Kod çalışırken | İşlem durur, hata türü ve yığın izi (stack trace) yazılır | Yığın izindeki ilk satırı okumak |
| Mantık hatası | Kod çalışır, sonuç yanlıştır | Hata mesajı yoktur; çıktı beklenenden farklıdır | Girdi ve çıktıyı el ile doğrulamak |
Mantık hatası en zor bulunanıdır, çünkü program hatasız çalışır. Bu tür hatalarda varsayım üretip hemen test etmek yerine, önce beklenen sonucu kâğıda yazmak gerekir.
Profil Kaydını Okumak
Profil kaydı, programın hangi bölümünün ne kadar süre harcandığını gösteren ölçümdür. Kayıtta iki süre özellikle önemlidir.
- Toplam süre (total time): Bir fonksiyonun içinde geçen bütün süre. Bu fonksiyonun alt çağrılarının süresini de kapsar.
- Kendi süresi (self time): Fonksiyonun kendi çalıştığı süre. Alt çağrılar çıkarıldıktan sonra kalan süredir.
Darboğaz aranırken yüksek toplam süre tek başına yeterli kanıt değildir; aynı fonksiyon kendi süresi yüksek olan adaylara bakılır. Kendi süresi yüksek olan bölüm, veri boyutu veya döngü sayısı gibi somut bir nedenle açıklanabiliyorsa düzeltme hedefi olur.
Ölçümü tekrarlamak da önemlidir: tek koşuya güvenmek yerine aynı senaryoyu birkaç kez çalıştırıp ortalamayı almak gürültüyü azaltır.
Ne Öğreneceğiz
Konsol araçları, hata ayıklama noktaları, çağrı yığını incelemesi, performans ve bellek profilleme yöntemleriyle uygulamadaki hataları bulup gidermeyi kapsar. Bu konuda ögrenme çıktıları:
- Konsol çıktısı, hata ayıklama noktası ve adım adım ilerleme araçlarını kullanır.
- Hata türlerini ayırt ederek hatanın kaynağına en kısa yoldan ulaşır.
- Çağrı yığını çıktısını okuyarak hatanın hangi satırdan geldiğini belirler.
- Performans kaydı alarak darboğazı ölçer ve sonucu geliştirme teknikleriyle karşılaştırır.
- Düzeltme sonrası yeniden ölçüm yaparak hatanın gerçekten giderildiğini doğrular.
Ön Bilgi
Bu konuya başlamadan önce temel kavram ve ön koşulları kavramanız yardımcı olacaktır. Konunun çerçevesinde şu kavramlar dikkat ister:
- Hata ayıklama, değişiklik yapmadan önce belirtiyi ölçmeyle başlar.
- Hata ayıklama noktası durulduğunda çağrı yığını, hatanın doğduğu yeri gösterir.
- Değişkenleri yazdırmak, sorunun varlığını kanıtlamanın en hızlı yoludur.
- Rastgele değişiklik, hata kaynağını gizleyebilir ve yeni hatalar doğurabilir.
- Darboğazı ölçmeden yapılan optimizasyon çoğu zaman hiçbir kazandırmaz.
- Düzeltme sonrası aynı senaryo yeniden ölçülerek karşılaştırılmalıdır.
Basit Örnek ve Günlük Yaşam
Günlük yaşamda ve mesleki bağlamda bir uygulama:
Soru: Sayfadaki bir düğmeye tıklandığında hiçbir işlev çalışmıyor. Hata ayıklama noktaları yerleştirilerek darboğaz nasıl bulunur?
- Tıklanan hedef öğeyi konsolda yaz ve doğru mu diye bak.
- Dinleyicinin bağlanıp bağlanmadığını adım adım izle.
- Bağlanmamışsa sıralamayı düzelt ve yeniden dene.
Sonuç/cevap: Dinleyici, öğe oluşturulduktan sonra bağlanmadıysa hiçbir zaman tetiklenmez. Doğru öğe seçilip bağlantı kurulduğunda işlev çalışır. Bu, hatanın mantıkta değil sıralamada olduğunu kanıtlar.
İleri Örnek
Daha ileri bir uygulama:
Soru: Bir kod parçasında değişken adı yanlış yazıldığı için çalışma zamanı hatası oluşuyor. Hangi hata türü beklenir?
- Hatanın oluşma anını belirle.
- Hatanın iletisindeki ipuc incele.
- Değişken tanımıyla kullanımını karşılaştır.
Sonuç/cevap: Tanımsız bir değişken okunduğunda referans hatası oluşur. Yazım kuralına aykırı yapıda ise söz dizimi hatası görülür; ikisi farklı nedenlerle oluşur.
Karşılaştırma Tablosu
| Kavram | Açıklama |
|---|
| Hata ayıklama, değişiklik yapmadan önce | Hata ayıklama, değişiklik yapmadan önce belirtiyi ölçmeyle başlar. |
| Hata ayıklama noktası durulduğunda çağrı | Hata ayıklama noktası durulduğunda çağrı yığını, hatanın doğduğu yeri gösterir. |
| Değişkenleri yazdırmak, sorunun varlığın | Değişkenleri yazdırmak, sorunun varlığını kanıtlamanın en hızlı yoludur. |
| Rastgele değişiklik, hata kaynağını gizl | Rastgele değişiklik, hata kaynağını gizleyebilir ve yeni hatalar doğurabilir. |
| Darboğazı ölçmeden yapılan optimizasyon | Darboğazı ölçmeden yapılan optimizasyon çoğu zaman hiçbir kazandırmaz. |
| Düzeltme sonrası aynı senaryo yeniden öl | Düzeltme sonrası aynı senaryo yeniden ölçülerek karşılaştırılmalıdır. |
Sık Yapılan Hatalar
Gözlem yapmadan değişiklik yapmak: Hata kaynağı bilinmeden yapılan düzeltmeler bazen işe yarar ama çoğu zaman sorunu gizleyip başka bir yere taşır.
Yalnızca konsol çıktısına güvenmek: Yazdırılan değer doğru görünse bile nesnenin gerçek tipi ya da referansı farklı olabilir; tip bilgisi de incelenmelidir.
Ölçmeden optimizasyon yapmak: En pahalı görünen satır, toplam sürenin büyük bölümünü oluşturmayabilir; kayıt alınmadan karar verilmemelidir.
Düzeltmeyi test etmemek: Hata kaybolması, düzeltmenin kalıcı olduğunu göstermez; aynı senaryo farklı girdilerle yeniden ölçülmelidir.
Kaldırılan öğelerin dinleyicilerini unutmak: Öğe DOM'dan silinse bile bağlı dinleyiciler bellekte kalır ve uzun oturumlarda yavaşlama yaratır.
Özet
Hata ayıklama ölçümle başlar ve kanıtla ilerler: konsol çıktısı değerin o anki hâlini gösterir, hata ayıklama noktası kodu durdurup çağrı yığını ve kapsam değişkenlerini inceletir, adım adım ilerleme hatanın hangi satırda başladığını bulur. Yeniden üretilebilir bir senaryo kurmak ve kodu yarıya indirerek izolasyon yapmak, sorumlu bölgeyi daraltır. Profil analizinde en pahalı çağrı ölçülür: 800 ms süren bir işlemde 700 ms alan tek bir çağrı için darboğaz oranı 700 ÷ 800 = 0,875 yani yüzde 87,5 olur. Düzeltmeden sonra aynı senaryo yeniden ölçülür; 800 ms yerine 250 ms alınması 550 ÷ 800 = 0,6875 ile yüzde 68,75 kazanç sağlar. Bellek profillemesi ise toplanmayan ayırma işlemlerini, yani dinleyici temizliği yapılmayan noktaları ortaya çıkarır.
Kendini Dene
Soru: Yönerge: Bir web uygulamasında kayıt düğmesine tıklandığında hiçbir şey olmuyor ve konsolda hata da görünmüyor. Bu sorunu gidermek için bir hata ayıklama planı yaz: (I) ilk ölçümü, (II) olası nedenleri sıralamayı, (III) izolasyon adımlarını, (IV) düzeltme sonrası doğrulamayı, (V) benzer hataları önleyen bir düzen maddesini yaz.
Örnek cevap: Puanlama anahtarı: İlk ölçümün konsol ve ağ paneliyle tanımlanması 5 puan; en az dört olası nedenin sıralanması 5 puan; izolasyon adımlarının ikili arama mantığıyla açıklanması 6 puan; düzeltme sonrası doğrulama ölçümünün yazılması 5 puan; önleyici düzen maddenin yazılması 4 puan. Toplam 25 puan. Model cevap: Önce tıklamanın DOM'a ulaşıp ulaşmadığı ölçülür, sonra dinleyicinin bağlı olup olmadığına bakılır. Olası nedenler: seçicinin boş dönmesi, bağlantının öğe oluşturulmadan önce yapılması, dinleyicinin birden çok kez bağlanması, hatalı olay adı kullanılması. İzolasyonda kodun yarısı devre dışı bırakılır ve sorumlu bölge bulunur. Düzeltme sonrası aynı senaryo yeniden ölçülür. Ayrıca dinleyici bağlanması tek bir noktada toplanır.