Bir hata ayıklayıcının her zaman mükemmel bir çözüm olmadığını ve her zaman hata ayıklama için ideal çözüm olmaması gerektiğini eklemek istiyorum. İşte bir hata ayıklayıcının sizin için çalışmayabileceği birkaç durum:
- Programınızın başarısız olan kısmı gerçekten büyüktür (zayıf modülerleştirme, belki?) Ve kodun içinden geçmeye nereden başlayacağınızdan tam olarak emin değilsiniz. Tüm bunların üzerinden geçmek çok zaman alabilir.
- Programınız çok sayıda geri çağırma ve diğer doğrusal olmayan akış kontrol yöntemlerini kullanır, bu da siz içinden geçtiğinizde hata ayıklayıcının kafasını karıştırır.
- Programınız çok iş parçacıklı. Daha da kötüsü, sorununuz bir yarış durumundan kaynaklanıyor.
- İçinde hata bulunan kod, hata vermeden önce birçok kez çalışır. Bu, özellikle ana döngülerde sorunlu olabilir veya daha da kötüsü, sorunun sayısal olabileceği fizik motorlarında olabilir. Bu durumda bir kesme noktası belirlemek bile, hata görünmeyecek şekilde ona birçok kez vurmanıza neden olur.
- Programınız gerçek zamanlı olarak çalışmalıdır. Bu, ağa bağlanan programlar için büyük bir sorundur. Ağ kodunuzda bir kesme noktası ayarlarsanız, diğer uç sizin adım atmanızı beklemeyecek, sadece zaman aşımına uğrayacaktır. Çerçeve atlama içeren oyunlar gibi sistem saatine dayanan programlar da daha iyi durumda değildir.
- Programınız dosyalara yazmak veya e-posta göndermek gibi bir takım yıkıcı eylemler gerçekleştirir ve bunun üzerinden kaç kez geçmeniz gerektiğini sınırlamak istersiniz.
- Hatanızın X fonksiyonuna gelen yanlış değerlerden kaynaklandığını söyleyebilirsiniz, ancak bu değerlerin nereden geldiğini bilmiyorsunuz. Programı tekrar tekrar çalıştırmak zorunda kalmak, kesme noktalarını daha uzağa ve daha geriye ayarlamak büyük bir güçlük olabilir. Özellikle program boyunca birçok yerden X fonksiyonu çağrılırsa.
Tüm bu durumlarda, ya programınızın aniden durması, sonuçların farklı olmasına neden olabilir ya da hatanın neden olduğu bir satırı aramak için manuel olarak ilerlemek çok güçtür. Hatanızın yanlış davranış veya bir çökme olması da aynı şekilde olabilir. Örneğin, bellek bozulması bir çökmeye neden oluyorsa, çökme meydana geldiğinde bellek bozulmasının ilk meydana geldiği yerden çok uzaktadır ve hiçbir yararlı bilgi kalmaz.
Peki alternatifler neler?
En basit, sadece günlük kaydı ve iddialardır. Programınıza çeşitli noktalarda günlükler ekleyin ve elde ettiklerinizi beklediğinizle karşılaştırın. Örneğin, bir hata olduğunu düşündüğünüz işlevin ilk etapta çağrılıp çağrılmadığına bakın. Bir yöntemin başlangıcındaki değişkenlerin sandığınız gibi olup olmadığına bakın. Kesme noktalarının aksine, içinde özel hiçbir şeyin olmadığı birçok günlük satırı olması sorun değildir. Daha sonra günlükte arama yapabilirsiniz. Beklediğinizden farklı bir günlük çizgisine bastığınızda, aynı alana daha fazlasını ekleyin. Dinlenmiş alandaki her satırı kaydedebilecek kadar küçük olana kadar daha da daraltın.
Onaylar, son kullanıcı tarafından görülebilen bir etkiye sahip olduklarında değil, oluştukları anda yanlış değerleri yakalamak için kullanılabilir. Yanlış bir değeri ne kadar çabuk yakalarsanız, onu üreten çizgiye o kadar yakın olursunuz.
Yeniden düzenleme ve birim testi. Programınız çok büyükse, bir seferde bir sınıf veya bir işlevi test etmek faydalı olabilir. Girdiler verin ve çıktılara bakın ve hangilerinin beklediğiniz gibi olmadığını görün. Tüm bir programdaki bir hatayı tek bir işleve daraltabilmek, hata ayıklama süresinde büyük bir fark yaratabilir.
Bellek sızıntıları veya belleğin durması durumunda, bunları çalışma zamanında analiz edebilen ve algılayabilen uygun araçları kullanın. Gerçek bozulmanın nerede meydana geldiğini tespit edebilmek ilk adımdır. Bundan sonra, yanlış değerlerin tanıtıldığı yere geri dönmek için günlükleri kullanabilirsiniz.
Hata ayıklamanın geriye doğru giden bir süreç olduğunu unutmayın. Son sonuca sahipsiniz - bir hata - ve ondan önceki nedeni bulun. Geriye doğru çalışmakla ilgili ve maalesef hata ayıklayıcılar sadece ileri adım atıyor. İyi kayıt ve ölüm sonrası analizin size çok daha iyi sonuçlar verebileceği yer burasıdır.