Yanıtlar:
Hiçbir şey varsayma
Sadece "ah, bu kodun ne yaptığını biliyorum, sorun değil" demek genellikle caziptir. Yapma bunu. Her varsayımı test edin ve her şeyi dikkatli bir şekilde yapın.
Artımlı olarak test etme .
İlk önce kodunuzda derinliğe inin ve yavaş yavaş hareket eden en küçük modülden test edin. Bu şekilde, sorunun tam olarak nerede olduğunu bulmak için çok fazla stres yaşamayacaksınız.
Ayrıca, artımlı olarak hareket ettiğiniz için bir seferde daha az kod etkilediği anlamına gelir. Bazen, bir şeyi düzelttiğim ve birçok başka şeyin kırılmasına neden olan sorunlarım oldu. Patronuma bununla uğraşırken bana bunu öğrettiği için kredi veririm.
Bölmek ve fethetmek iyi bir yaklaşımdır. Sorunun var olduğu bazı görünür girişleri (kullanıcı giriş / ağ olayı ...) ve çıkışını (günlük, kullanıcıya çıkış, giden ağ mesajı ...) belirlemeye çalışın. Baskıları oldukça büyük parçalara veya aralarındaki önemli noktalara yerleştirmeyi deneyin ve hatanın kodun neresinde olduğunu daraltın.
Bölünme ve fethetme, sürüm kontrollü kod üzerindeki gerilemelerde de çok iyi çalışabilir. İki yapı bulun - biri beklendiği gibi çalışıyor, diğeri regresyonda. Potansiyel şüpheliler olarak bir sürü checkin ile bırakılana kadar boşluğu kısaltın.
İkili böcek pirzolasından ziyade, formdaki testleri yazın
Uygulamanın işleyişi ile ilgili olarak doğru olduğunu bildiğinizi doğrulamak için neyin doğru olduğunu varsaydığınızı doğrulamak için.
Çoğu IDE, metotları çıkarmayı ve xUnit test saplamaları oluşturmayı kolaylaştırır. Bunu kullan.
Neden hata ayıklama serpin değil? Çünkü işiniz bittikten sonra, muhtemelen bu çalışmanın çoğunu geri almanız ve bu hata ayıklamaların adil bir miktarını silmeniz gerekecektir. Testler yazdığınızda, hata ayıklama işleminiz gelecekteki hataların önlenmesine ve tespitine yardımcı olacaktır.
Diğerlerinin dediği gibi - hiçbir şey varsaymayın. Bu, özellikle kodunu yazdıysanız geçerlidir. Başkalarının kodlarını ayıklarken, kod sizin için yeni olduğundan veya kodlayıcıya güvenmediğiniz için yavaşlamanız daha olasıdır. Kendi kodunuzu hata ayıklama yaparken doğru yazdığını varsaymak çok kolay, yavaşlayın!
Gerçek hata ayıklama işlemi için:
Ünite testleri ekleme ve günlüğe kaydetme ilk önce debugger kullanmaktan daha verimlidir. Ayrıca gelecekteki hataların ortaya çıkmamasına yardımcı olmak için ünite testlerine sahip olmanın avantajını elde edersiniz ve günlük kaydı gelecekte yapılacak oturumlarda hata ayıklamaya yardımcı olur.
Küçük bir kod grubuna geçmeden önce sonucu doğru bir şekilde belirleyip belirleyemediğinize bakın. Bu, hiçbir şeyi kabul etmeme karşısında uçmaya meyillidir (ki ben BTW'ye oy verdim) ama deneyim kazandıkça, nereye bakılacağını daraltmaya yardımcı olabilir.
Bu önemsiz gelebilir, ancak hata ayıklayıcınızın nüanslarını ve kısayol tuşlarını öğrenin. Bazen hata ayıklayıcılar, adım attığınızda zihninizin merak ettiği kadar yavaş olabilir. Makineye ayak uydurabiliyorsanız ve etrafta dolaşmıyorsanız, bu yardımcı olabilir.
Hata ayıklama sırasında kodu değiştirebilirsiniz:
sevmek:
bool isLessThan5 = a < 5;
bool isGreaterThan10 = a > 10;
if ( isLessThan5 || isGreaterThan10 )
{
// more code here
}
yerine:
if ( a < 5 || a > 10 )
{
// more code here
}
Her şeyde hata ayıklayamazsanız, ne sebeple olursa olsun, bir iş arkadaşınızla "lastik ördek" öğrenirsiniz. Bazen açıklama yapmak ışık tutuyor. (tamam, belki de bu tam olarak sorular temasında değildir, ancak bahsetmek için yeterince yakın olduğunu düşünüyorum)
Son 22 yılın çoğunu harcamaya dayanan iki şey başkalarının yazdığı kuralları koruyarak yazdı.
Yazma eğiliminde olduğunuz böcek türlerini anlayın.
Mesela, çok titiz bir kodlayıcıyım, bu yüzden kodum derlendiğinde, genellikle önemsiz hatalardan arındırılmış olur. Böylelikle böceklerim iplik kilitlenmeleri gibi garip karmaşık şeyler olabilir. Kapak tarafında, daha çok önemsiz hatalar yazan bir arkadaşım var - C ++ 'ın sonunda döngüler için noktalı virgül, bu nedenle bir sonraki satır sadece bir kez idam edilir.
Başkalarının da aynı hataları yaptığınızı varsaymayın.
Büyük hata ayıklama silahlarını çıkarmakla zamanımı boşa harcadığımı bilmiyorum, bir böceğin gerçekten garip bir şey olduğunu farz ediyorum, sadece arkadaşımın omzuma bakıp gitmesini sağlamak, " noktalı virgül?" Bundan yıllar sonra, diğer insanların kodlarına bakarken ilk önce önemsiz, alçak meyveli meyvelere bakarım.
Aletlerini bil. Örneğin, Visual Studio'nun hata ayıklayıcısının kesme noktaları gibi olan TracePoints adında harika bir özelliği vardır ancak kodunuzu durdurmak yerine bunun yerine hata ayıklama çıktısına bir izleme ifadesi ekler.
Hata ayıklayıcınızı nasıl kullanacağınıza dair kitap okumak veya ders almak şiddetle tavsiye edilir. Birkaç ders aldım ve John Robbins'in bir hata ayıklayıcı olarak etkinliğimde büyük fark yaratan birkaç kitap okudum.
Otomatik birim testi ve diğer entegrasyon ve fonksiyonel test türlerini yazın.
Otomatik testler ne kadar çok olursa, bir hata ayıklayıcıda daha az zaman harcamanız gerekir.
Ayrıca, iyi tasarım - KATI ilkeleri. Küçük, odaklanmış sınıflar yazıyorsanız ve kalıtımın üstesinden gelmek, çoğaltmayı ortadan kaldırmak vb. İçin kompozisyon oluşturuyorsanız, kodunuzun hata ayıklaması her zaman daha kolay olacaktır.
İyi tasarlanmış kodun, iyi tasarlanmamış kodun farklı bir hata kümesi ürettiğini biliyorum. Genel olarak konuşursak, iyi tasarlanmış kod bulmak, çoğaltmak ve düzeltmek daha kolay hatalar üretir.
İstisna (ve her zaman bir tane var) çok iş parçacıklı kod :-)
Çok değerli kitabı inceleyin Neden Programlar Başarısız Olur: Sistematik Hata Ayıklamaya Yönelik Bir Kılavuz , Andreas Zeller. Size, bazıları araştırmanın üstünlüğü olan birçok teknik, teori ve araç tanıtacaktır.
Kitabın slaytları çevrimiçi olarak mevcuttur, ancak kitabın kendisini okumasının daha kolay olduğunu biliyorum.
Kitap, başlamanıza ve hata ayıklama hakkında daha bilimsel bir şekilde düşünmenize yardımcı olur, ancak uygulama yerine geçmez. Performansınızda büyük bir gelişme sırası görmeden önce 10 yıl boyunca yazıp hata ayıklamanız gerekebilir. Sun'da çenemdeki düşüşün, Unix'i 30 yıldır programlayan kıdemli geliştiricileri görmekte olduğunu hala hatırlıyorum. Deneyim meseleleri!