Hata ayıklayıcı nedir ve sorunları teşhis etmeme nasıl yardımcı olabilir?
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.
Yanıtlar
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 için ö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ımlama adı verilir ) çalıştırmak için bir hata ayıklayıcı kullanabilirsiniz .
Hata ayıklayıcı kullanmak beklenen temel bir beceridir
Bir 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 göndermeniz 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 bir 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 .
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 birçok geri çağırma ve diğer doğrusal olmayan akış kontrol yöntemlerini kullanır, bu da hata ayıklayıcının içinden geçtiğinizde 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 gerçekleşebilir. Ö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şı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ı normaldir. 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 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. Burası, iyi bir günlük kaydı ve ölüm sonrası analizin size çok daha iyi sonuçlar verebileceği yerdir.