Mevcut kodun hatalarını ayıklama yeteneğinizi nasıl geliştirebilirsiniz [kapalı]


Yanıtlar:


32

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.


2
+1. Kesinlikle. Bildiğini sandığın bazı şeylerin senin için oyun oynayacağına şaşırmaya hazır ol.
aufather

benim için çalışıyor :)
setzamora

3
Başka birinin kodunu hata ayıklamak büyük bir zaman kaybı, verimlilik katilidir, ancak bu böyledir. Diğerlerinin hatalarını düzeltmenin gerçekten mantıklı olduğu tek zaman, bıraktıkları zamandır. Nefret Nefreti Nefret, kıdemli bir kodlayıcı tarafından nesnel olarak berbat bir koddan geçiyor, ardından zamanında ilerleme sağlamak için bir soru sormak zorunda ve mevcut kod tabanını öğrenme becerilerimi geliştirmeye yönelik bir ders alıyor. Tabiat doğasını incelemek yerine, insan kaynaklı sapmaları çözmek pek de eğlenceli değildir. En azından cevabımı alıyorum. Tam tersi bir durum olmayacak çünkü ben daha iyiyim ve daha az hata bıraktım.
İş

1
@Job: ... tamam mı? Muhtemelen bu yorumu yazıya bırakmak mı istediniz? :)
Adam Lear

Bu! Tuhaf bir hata ayıklama yapıyorsanız ve kodun iyi görünmesi durumunda, kodunuzun küçük bir kısmına körü körüne güvenmek saçma.
Dan

7

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.


4

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.


4

İkili böcek pirzolasından ziyade, formdaki testleri yazın

  • Verilen ...
  • Ne zaman...
  • Expect ...

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.


2

Hata ayıklamaya devam et. Çok hata ayıklarsanız, iyileştirirsiniz.


Kesinlikle hata ayıklama, başlı başına bir sanattır, özellikle de diğer insanların kodlarında hata ayıklama.
Gratzy

2

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:

  • Mevcut değilse, birim testleri yazınız.
  • Mevcut değilse, uygun bir kayıt ekleyin.
  • Sonra hata ayıklama kullanın.

Ü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.


1

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:

  • öncesi ve sonrası koşulları iddia etmeyi düşünün. Bazen daha sonra kod yerine adım atabilirsiniz.
  • Çünkü eğer karmaşık ifadelerle yapılan ifadeler bir şeyi düşünün (bazıları bu konuda kaşlarını çatabilir ama benim için işe yarayabilir)

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)


1
Alt koşulların isimlendirilmesi bir adım daha gerektirmektedir, yani koşulun ne için olduğunu öğrendiğinizde isimlerin yeniden düzenlenmesi. if (tooCloseToHydrant || overTheBrink) { Daha sonra öğrendiğiniz zaman olabilir .

1

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.


Bir şey olup olmadığını görmek için kodu yeniden biçimlendirir misiniz?

@ Thorbjørn: Kodun mülkiyetini aldıysam, bazen okunabilirliği artırmak için yazarımı bulmak için yapıyorum. İlginç fikir!
Bob Murphy,

Bunu yapmak zorunda değilsin, sadece ne olduğunu gör. Tercihen otomatik - - şiddetle yeniden formatlanması kod gerektirir askıya alan siyaset uygulayan önerebilir kontrol ederken.

@ Thorbjørn: Bunu yapmak isterim. "Güzelleştirici" kodu olarak ne önerirsin? Çoğunlukla Linux ve Mac'te çalışıyorum.
Bob Murphy,

Her iki yerde de kullanılabilir Eclipse kullanıyorum ve Java editörü, her dosya kaydedildiğinde ne olacağını belirtebileceğiniz bir Kaydetme işlemine sahip. Burada seçeneklerden biri kaynağı biçimlendirmektir. Biz küçük bir ekibiz, bu yüzden daha fazla araştırma yapmadım. Daha deneyimli ekipler kaynak kontrol sistemlerinde önceden işlenmiş kancalara izin verir, bir yanlış biçimlendirilmişse bir kaynağın reddedilmesine izin verir. Çok verimli.

1

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.


0

Kodun ne yapmaya çalıştığını işlevsel olarak anlayın. Resmin tamamını bilmiyorsanız (tüm test durumları bu kodun geçmesi gerekir) yeni hatalar vermeden doğru şekilde hata ayıklamak zordur


0

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 :-)


0

Küçük bir bölgeye daralttıysanız ancak hala hatayı göremiyorsanız, hata ayıklayıcınızın 'kodu görüntüle' montajını deneyin. "Burada bir dal olması gerekir" veya "neden sadece düşük kelimeyi kopyalıyor?" Diyecek kadar ASM bilmek. kodlama hatasını sıklıkla saptar.


0

Ç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!


Onların otomatik yazılımı çok ilginç görünüyor.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.