Hata ayıklayıcı nedir ve sorunları teşhis etmeme nasıl yardımcı olabilir?


101

Bu, bir programla sorunu olan, ancak sorunun nedenini teşhis etmek için bir hata ayıklayıcıyı nasıl kullanacağını bilmeyen yeni programcılara yardımcı olmak için genel amaçlı bir soru olması amaçlanmıştır.

Bu soru, daha spesifik sorudan oluşan üç sınıfı kapsar:

  • Programımı çalıştırdığımda verdiğim girdi için beklediğim çıktıyı üretmiyor.
  • Programımı çalıştırdığımda çöküyor ve bana bir yığın izleme veriyor. Ben var yığın izleme incelenmiş ancak yığın izleme yeterli bilgileri bana sağlamaz çünkü hala sorunun sebebini bilmiyoruz.
  • Programımı çalıştırdığımda, segmentasyon hatası (SEGV) nedeniyle çöküyor.

3
Güzel bir çalışma - o da ilgili olması için Q & A "gitme" iyi olurdu teknikleri hata ayıklama (örn valgrind), stratejik printfs, stres testi, böl ve fethet, vb örneğin, bir hata ayıklayıcı diğer ayıklama araçları kullanılarak
Paul R

1
@PaulR'ye katılıyorum, SSS'de bunun gibi şeyler olmalıdır
Nicu Stiurca

Yanıtlar:


65

Hata ayıklayıcı, programınız çalışırken programınızın durumunu inceleyebilen bir programdır. Bunu yapmak için kullandığı teknik araçlar, bir hata ayıklayıcının nasıl kullanılacağının temellerini anlamak açısından önemli değildir. Kodunuzda belirli bir yere ulaştığında programınızın çalışmasını durdurmak için bir hata ayıklayıcı kullanabilir, ardından programdaki değişkenlerin değerlerini inceleyebilirsiniz. Değişkenlerinin değerlerini incelerken, programınızı çok yavaş, her seferinde bir satır kod ( tek adımlı ) çalıştırmak için bir hata ayıklayıcı kullanabilirsiniz .

Hata ayıklayıcı kullanmak beklenen temel bir beceridir

Hata ayıklayıcı, programlarla ilgili sorunları teşhis etmeye yardımcı olan çok güçlü bir araçtır. Ve tüm pratik programlama dilleri için hata ayıklayıcılar mevcuttur. Bu nedenle, bir hata ayıklayıcı kullanabilmek , herhangi bir profesyonel veya hevesli programcının temel becerisi olarak kabul edilir . Ve bir debugger kullanarak kendinizi kabul edilir temel işi yapmanız gereken kendinize yardım başkalarını istemeden önce. Bu site profesyonel ve hevesli programcılar için olduğundan ve bir yardım masası veya akıl hocalığı sitesi olmadığından, belirli bir programla ilgili bir sorunla ilgili sorunuz varsa, ancak bir hata ayıklayıcı kullanmadıysanız, sorunuz büyük olasılıkla kapatılır ve reddedilir. Böyle sorularla ısrar ederseniz, sonunda daha fazla gönderi paylaşmanız engellenir.

Bir hata ayıklayıcı size nasıl yardımcı olabilir?

Bir hata ayıklayıcı kullanarak, bir değişkenin yanlış değere sahip olup olmadığını ve programınızda değerinin nerede yanlış değere değiştiğini keşfedebilirsiniz.

Tek adımlamayı kullanarak, kontrol akışının beklediğiniz gibi olup olmadığını da keşfedebilirsiniz. Örneğin, bir ifşubenin olmasını beklediğiniz zaman çalıştırılıp çalıştırılmayacağı.

Hata ayıklayıcı kullanmayla ilgili genel notlar

Bir hata ayıklayıcı kullanmanın özellikleri, hata ayıklayıcıya ve daha az ölçüde, kullandığınız programlama diline bağlıdır.

  • Sen edebilirsiniz takmak zaten programı çalıştıran bir işlemi bir hata ayıklayıcı. Programınız sıkışmışsa yapabilirsiniz.

  • Pratikte, programınızı en başından itibaren bir hata ayıklayıcının kontrolü altında çalıştırmak genellikle daha kolaydır.

  • Sen belirtmek nerede program yürütme durmalı hangi hattın kaynak kodu dosyası ve satır numarası belirterek yürütme durmalı veya aynı durdurmak istiyorsanız programı (durmalı hangi yöntem / fonksiyonun adını belirterek yürütme yönteme girer girmez). Hata ayıklayıcının programınızın durmasına neden olmak için kullandığı teknik araçlara kesme noktası denir ve bu işleme bir kesme noktası ayarlama denir .

  • Çoğu modern hata ayıklayıcı bir IDE'nin parçasıdır ve programınızın kaynak kodunu ve değişkenlerini incelemek için uygun bir GUI, kesme noktaları ayarlamak, programınızı çalıştırmak ve onu tek adımlamak için bir işaretle ve tıkla arabirimi sağlar.

  • Program yürütülebilir veya bayt kodu dosyalarınız hata ayıklama sembol bilgilerini ve kaynak kodunuza çapraz referansları içermediği sürece bir hata ayıklayıcı kullanmak çok zor olabilir . Bilgilerin mevcut olduğundan emin olmak için programınızı biraz farklı şekilde derlemeniz (veya yeniden derlemeniz) gerekebilir . Derleyici kapsamlı optimizasyonlar gerçekleştirirse, bu çapraz referanslar kafa karıştırıcı hale gelebilir. Bu nedenle programınızı optimizasyonlar kapalıyken yeniden derlemeniz gerekebilir .


4
Stackoverflow'daki soru sayısını çok önemli ölçüde azaltma potansiyeline sahip (en az% 20 tahmin ediyorum) - javascript hata ayıklayıcıları: firebug, Chrome, Firefox, IE9 + entegre hata ayıklayıcı olan en önemli hata ayıklayıcıyı kaçırdığı için bu eksiktir. , IE8- Visual Studio, vb.
slebetman

1
Ayrıca node.js - düğüm denetçisi için. Ancak node.js programcıları, genel javascript programcıları kadar temel ve / veya kodumu düzelt sorusu sormazlar.
slebetman

38

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.


10
Bu, farklı bir sorunun ... iyi bir cevabı olabilir. Bu soru için kötü bir cevap . Belki de bu soruyu sormalı ve yanıt olarak göndermelisiniz.
Raedwald

7
Asıl soru, "bir programla sorunu olan yeni programcılara yardımcı olun", "beklediğim çıktıyı üretmiyor" ve "yığın izlemeyi inceledim, ancak sorunun nedenini hala bilmiyorum" olarak tanımlanıyor. . Bunların hepsine bu cevap yardımcı olur. Bir hata ayıklayıcı ne yaptığını açıklayan, ayrıca, bunun ne olduğunu açıklamak aynı derecede önemlidir vermez yapmak.
SlugFiller

5
Mükemmel cevap. Hataları bulmak için her zaman hata ayıklayıcıyı ana araç olarak kullandım. Ama şimdi büyük bir altyapı bileşeninin birçok iş parçacığı ve çok sayıda ağ kodu (istemci / sunucu) kullandığı bir projede çalışıyorum ve hata ayıklayıcının bana yardımcı olan son şey olduğunu fark ediyorum. Eski güzel hata ayıklayıcınıza güvenmek yerine gerçekten farklı bir araç kullanmanız gereken birçok şeyden bahsettiniz (en önemlisi: günlük kaydı).
Tim Schmelter

"Hatanızın X fonksiyonuna gelen yanlış değerlerden kaynaklandığını anlayabilirsiniz, ancak bu değerlerin nereden geldiğini bilmiyorsunuz" Bu özellikle hata ayıklaması zordur. Genelde böyle bir şeyi nasıl tamir edersin?
Ayxan Haqverdili

2
@Ayxan Bir dereceye kadar, işlevi bir iddia üzerinde durdurmayı başardıysanız, arayanı bulmak için çağrı yığınını kullanabilirsiniz. Ancak bu tek başına size değerin kaynağını vermez, çünkü değer büyük olasılıkla daha önceki bir satırdan gelmektedir. Temelde, geçtiği çeşitli değişkenler aracılığıyla değeri geri takip etmelisiniz. Verilerin gittiği yol hakkında iyi bir fikriniz varsa, bir sürü günlük baskısı oluşturabilir ve "yanlış gittiği" yerleri daraltmaya çalışabilirsiniz. Değilse, her geri adım için temelde programın ayrı bir çalıştırılmasına (hatayı yeniden üretmeye) ihtiyacınız olacak.
SlugFiller
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.