Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Yazılım geliştiricileri olarak yazdığımız kodlar, her zaman beklentilerimizi karşılamaz. Bazen tamamen farklı bir şey yapar! Beklenmeyen bir durum oluştuğunda, bir sonraki görev bunun nedenini bulmaktır ve kodumuza saatlerce bakmaya devam etmek isteyebiliriz, ancak hata ayıklama aracı veya hata ayıklayıcı kullanmak daha kolay ve daha verimlidir.
Ne yazık ki hata ayıklayıcı, kodumuzdaki tüm sorunları veya "hataları" sihirli bir şekilde ortaya çıkarabilecek bir şey değildir. Hata Ayıklama, programlama hatası yaptığınız noktayı tam olarak bulmak için kodunuzu Visual Studio gibi bir hata ayıklama aracında adım adım çalıştırmak anlamına gelir. Daha sonra kodunuzda ve hata ayıklama araçlarınızda yapmanız gereken düzeltmeleri anlarsınız ve programı çalıştırmaya devam edebilmeniz için genellikle geçici değişiklikler yapmanıza olanak sağlar.
Bir hata ayıklayıcıyı etkili bir şekilde kullanmak, öğrenmesi zaman ve uygulama gerektiren bir beceridir, ancak sonuçta her yazılım geliştiricisi için temel bir görevdir. Bu makalede, hata ayıklamanın temel ilkelerini tanıtacak ve başlamanıza yönelik ipuçları sağlayacağız.
Kendinize doğru soruları sorarak sorunu netleştirin
Düzeltmeye çalışmadan önce karşılaştığınız sorunu netleştirmeye yardımcı olur. Kodunuzda zaten bir sorunla karşılaştığınızı tahmin ediyoruz, aksi takdirde burada hata ayıklamayı bulmaya çalışmazsınız! Bu nedenle, hata ayıklamaya başlamadan önce çözmeye çalıştığınız sorunu tanımladığınızdan emin olun:
Kodunuzun ne yapmasını bekliyorsunuz?
Bunun yerine ne oldu?
Uygulamanızı çalıştırırken bir hatayla (özel durum) karşılaşırsanız, bu iyi bir şey olabilir! Özel durum, kod çalıştırılırken karşılaşılan beklenmeyen bir olaydır ve genellikle bir tür hatadır. Hata ayıklama aracı sizi kodunuzda özel durumun oluştuğu tam yere götürebilir ve olası düzeltmeleri araştırmanıza yardımcı olabilir.
Başka bir şey olduysa, sorunun belirtisi nedir? Bu sorunun kodunuzda nerede oluştuğuna zaten şüpheleniyor musunuz? Örneğin, kodunuz bir metin görüntülüyorsa ancak metin yanlışsa, verilerinizin hatalı olduğunu veya görüntüleme metnini ayarlayan kodun bir tür hataya sahip olduğunu bilirsiniz. Hata ayıklayıcıdaki kodda adım adım ilerleyerek değişkenlerinizdeki her değişikliği inceleyerek tam olarak ne zaman ve ne kadar yanlış değerlerin atandığı hakkında bilgi edinebilirsiniz.
Varsayımlarınızı inceleme
Bir hatayı veya hatayı araştırmadan önce, belirli bir sonuç beklemenize neden olan varsayımları düşünün. Gizli veya bilinmeyen varsayımlar, hata ayıklayıcıdaki sorunun nedenini doğru incelediğinizde bile bir sorunu tanımlamanın yolunu açabilir. Olası varsayımların uzun bir listesine sahip olabilirsiniz! Varsayımlarınızı sınamak için kendinize sormanız gereken birkaç soru aşağıdadır.
Doğru API'yi mi (doğru nesne, işlev, yöntem veya özellik) kullanıyorsunuz? Kullandığınız bir API, düşündüğünüz şeyi yapmayabilir. (Hata ayıklayıcıda API çağrısını inceledikten sonra düzeltme, doğru API'yi tanımlamaya yardımcı olmak için belgelere bir gezi gerektirebilir.)
API'yi doğru kullanıyor musunuz? Doğru API'yi kullanmış ancak doğru şekilde kullanmamış olabilirsiniz.
Kodunuz herhangi bir yazım hatası içeriyor mu? Özellikle değişkenlerin kullanılmadan önce bildirilmesi gerekmeyen dillerle çalışırken, değişken adının basit bir yanlış yazılması gibi bazı yazım hatalarını görmek zor olabilir.
Kodunuzda bir değişiklik yaptınız ve gördüğünüz sorunla ilgili olmadığını mı varsaydınız?
Bir nesnenin veya değişkenin gerçekten olandan farklı bir değer (veya belirli bir değer türü) içermesini bekliyor muydunuz?
Kodun amacını biliyor musunuz? Başka birinin kodunda hata ayıklamak genellikle daha zordur. Kodunuz değilse, etkili bir şekilde hata ayıklamadan önce kodun tam olarak ne yaptığını öğrenmek için zaman harcamanız gerekebilir.
Bahşiş
Kod yazarken küçük bir başlangıç yapıp çalışan kodla başlayın! (burada iyi örnek kod yararlı olacaktır.) Bazen, gerçekleştirmeye çalıştığınız temel görevi gösteren küçük bir kod parçasıyla başlayarak büyük veya karmaşık bir kod kümesini düzeltmek daha kolaydır. Ardından, kodu artımlı olarak değiştirebilir veya ekleyebilir ve her noktada hataları test edebilirsiniz.
Varsayımlarınızı sorgulayarak kodunuzda bir sorun bulmak için gereken süreyi kısaltabilirsiniz. Bir sorunu çözmek için gereken süreyi de azaltabilirsiniz.
Sorunun oluştuğu yeri bulmak için hata ayıklama modunda kodunuzu adım adım ilerleyin
Normalde bir uygulamayı çalıştırdığınızda, yalnızca kod çalıştırıldıktan sonra hatalar ve yanlış sonuçlar görürsünüz. Bir program da nedenini söylemeden beklenmedik bir şekilde sonlandırabilir.
hata ayıklama modu olarak da adlandırılan bir uygulamayı bir hata ayıklayıcı içinde çalıştırdığınızda, program çalışırken hata ayıklayıcı gerçekleşen her şeyi etkin bir şekilde izler. Ayrıca, uygulamayı herhangi bir noktada duraklatarak durumunu incelemenize ve ardından kod satırınızda satır satır ilerleyerek her ayrıntıyı izlemenize olanak tanır.
Visual Studio'da, F5 tuşlarını kullanarak hata ayıklama moduna girersiniz (veya Hata Ayıklama>menüsündeki Hata Ayıklamayı Başlat komutunu ya da Hata Ayıklamayı Başlat düğmesini kullanabilirsiniz. Hata Ayıklama Araç Çubuğu'nda ). Herhangi bir özel durum oluşursa, Visual Studio'nun Özel Durum Yardımcısı sizi özel durumun oluştuğu noktaya götürür ve diğer yararlı bilgileri sağlar. Kodunuzdaki özel durumları işleme hakkında daha fazla bilgi için bkz. hata ayıklama teknikleri ve araçları.
Bir özel durum almadıysanız, büyük olasılıkla kodunuzda sorunu nerede arayabileceğiniz konusunda iyi bir fikriniz vardır. Bu adımda, hata ayıklayıcıyla kesme noktalarını kullanarak kodunuzu daha dikkatli bir şekilde inceleme fırsatına sahip olursunuz. Kesme noktaları, güvenilir hata ayıklamanın en temel ve temel özelliğidir. Kesme noktası, Visual Studio'nun çalışan kodunuzu nerede duraklatması gerektiğini gösterir; böylece değişkenlerin değerlerine veya kodun çalıştığı sıraya veya belleğin davranışına göz atabilirsiniz.
Visual Studio'da, bir kod satırının yanındaki sol kenar boşluğuna tıklayarak hızla kesme noktası ayarlayabilirsiniz. veya imleci bir çizginin üzerine getirin ve F9tuşuna basın.
Bu kavramları göstermeye yardımcı olmak için, zaten birkaç hatası olan bazı örnek kodlara göz atacağız. C# kullanıyoruz ancak hata ayıklama özellikleri Visual Basic, C++, JavaScript, Python ve desteklenen diğer diller için geçerlidir. Visual Basic için örnek kod da sağlanır, ancak ekran görüntüleri C# dilindedir.
Örnek uygulama oluşturma (bazı hatalarla)
Ardından, birkaç hatası olan bir uygulama oluşturacaksınız.
Visual Studio'yu ve .NET masaüstü geliştirme iş yükünü yüklemiş olmanız gerekir.
Visual Studio'yu henüz yüklemediyseniz ücretsiz yüklemek için Visual Studio indirmeleri sayfasına gidin.
Zaten Visual Studio'ya sahipseniz fakat iş yükünü yüklemeniz gerekiyorsa, Araçlar>Araçları ve Özellikleri Alseçeneğini seçin. Visual Studio Yükleyicisi başlatılır. .NET masaüstü geliştirme iş yükünü seçin ve ardından Değiştir'iseçin.
Visual Studio'yu açın.
Başlangıç penceresinde yeni proje oluştur seçin. Arama kutusuna konsol yazın, dil olarak C# veya Visual Basic seçin ve ardından .NET için Konsol Uygulaması seçin. Sonrakiseçin. Proje adı olarak ConsoleApp_FirstApp yazın ve İleriseçin.
Farklı bir proje adı kullanıyorsanız, örnek kodu kopyalarken ad alanı değerini proje adınızla eşleşecek şekilde değiştirmeniz gerekir.
Önerilen hedef çerçeveyi veya .NET 8'i seçin ve ardından Oluştur'useçin.
.NET için Konsol Uygulaması proje şablonunu görmüyorsanız, Visual Studio Yükleyicisi'ni açan Araçları>Araç ve Özellik Alsayfasına gidin. .NET masaüstü geliştirme iş yükünü seçin ve ardından Değiştir'iseçin.
Visual Studio, sağ bölmedeki Çözüm Gezgini'nde görünen konsol projesini oluşturur.
Program.cs (veya Program.vb) içinde, tüm varsayılan kodu aşağıdaki kodla değiştirin. (Önce C# veya Visual Basic için doğru dil sekmesini seçin.)
- C#
- Visual Basic
using System; using System.Collections.Generic; namespace ConsoleApp_FirstApp { class Program { static void Main(string[] args) { Console.WriteLine("Welcome to Galaxy News!"); IterateThroughList(); Console.ReadKey(); } private static void IterateThroughList() { var theGalaxies = new List<Galaxy> { new Galaxy() { Name="Tadpole", MegaLightYears=400, GalaxyType=new GType('S')}, new Galaxy() { Name="Pinwheel", MegaLightYears=25, GalaxyType=new GType('S')}, new Galaxy() { Name="Cartwheel", MegaLightYears=500, GalaxyType=new GType('L')}, new Galaxy() { Name="Small Magellanic Cloud", MegaLightYears=.2, GalaxyType=new GType('I')}, new Galaxy() { Name="Andromeda", MegaLightYears=3, GalaxyType=new GType('S')}, new Galaxy() { Name="Maffei 1", MegaLightYears=11, GalaxyType=new GType('E')} }; foreach (Galaxy theGalaxy in theGalaxies) { Console.WriteLine(theGalaxy.Name + " " + theGalaxy.MegaLightYears + ", " + theGalaxy.GalaxyType); } // Expected Output: // Tadpole 400, Spiral // Pinwheel 25, Spiral // Cartwheel, 500, Lenticular // Small Magellanic Cloud .2, Irregular // Andromeda 3, Spiral // Maffei 1, 11, Elliptical } } public class Galaxy { public string Name { get; set; } public double MegaLightYears { get; set; } public object GalaxyType { get; set; } } public class GType { public GType(char type) { switch(type) { case 'S': MyGType = Type.Spiral; break; case 'E': MyGType = Type.Elliptical; break; case 'l': MyGType = Type.Irregular; break; case 'L': MyGType = Type.Lenticular; break; default: break; } } public object MyGType { get; set; } private enum Type { Spiral, Elliptical, Irregular, Lenticular} } }
Bu kod için amacımız galaksi adını, galaksiye olan uzaklığı ve galaksi türünü bir listede görüntülemektir. Hata ayıklamak için kodun amacını anlamak önemlidir. Çıktıda göstermek istediğimiz listeden bir satırın biçimi aşağıdadır:
galaksi adı, uzaklık, galaksi türü.
Uygulamayı çalıştırma
F5 veya Hata Ayıklamayı Başlat düğmesine .
Uygulama başlıyor ve hata ayıklayıcı bize herhangi bir özel durum göstermiyor. Ancak konsol penceresinde gördüğünüz çıkış beklediğiniz gibi değildir. Beklenen çıkış şu şekildedir:
Tadpole 400, Spiral
Pinwheel 25, Spiral
Cartwheel, 500, Lenticular
Small Magellanic Cloud .2, Irregular
Andromeda 3, Spiral
Maffei 1, Elliptical
Ancak, bunun yerine bu sonuçları görürsünüz.
Tadpole 400, ConsoleApp_FirstApp.GType
Pinwheel 25, ConsoleApp_FirstApp.GType
Cartwheel, 500, ConsoleApp_FirstApp.GType
Small Magellanic Cloud .2, ConsoleApp_FirstApp.GType
Andromeda 3, ConsoleApp_FirstApp.GType
Maffei 1, 11, ConsoleApp_FirstApp.GType
Çıkışa ve kodumuza baktığımızda, GType
galaksi türünü depolayan sınıfın adı olduğunu biliyoruz. Sınıf adını değil gerçek galaksi türünü ("Spiral" gibi) göstermeye çalışıyoruz!
Uygulamada hata ayıklama
Uygulama çalışmaya devam ediyorken bir kesme noktası ekleyin.
foreach
döngüsünde, bağlam menüsünü açmak içinConsole.WriteLine
yönteminin yanına sağ tıklayın ve açılır menüden >Kesme Noktası Ekle seçeneğini seçin.- C#
- Visual Basic
foreach (Galaxy theGalaxy in theGalaxies) { Console.WriteLine(theGalaxy.Name + " " + theGalaxy.MegaLightYears + ", " + theGalaxy.GalaxyType); }
Kesme noktasını ayarladığınızda, sol kenar boşluğunda kırmızı bir nokta görünür.
Çıktıda bir sorun gördüğünüzde, hata ayıklayıcıda çıkışı ayarlayan önceki koda bakarak hata ayıklamaya başlarsınız.
Hata Ayıklama araç çubuğunda RestartApp düğmesini gösteren Yeniden Başlat
düğmesi (Ctrl + Shift + F5).
Uygulama, ayarladığınız kesme noktasında duraklatılır. Sarı vurgulama, hata ayıklayıcının nerede duraklatıldığını gösterir (sarı kod satırı henüz yürütülmedi).
Sağ taraftaki
GalaxyType
değişkeninin üzerine gelerek, kurbağacık simgesinin solundatheGalaxy.GalaxyType
'i genişletin.GalaxyType
MyGType
bir özellik içerdiğini ve özellik değerininSpiral
olarak ayarlandığını görürsünüz."Spiral" aslında konsola yazdırmayı beklediğiniz doğru değerdir! Bu nedenle, uygulamayı çalıştırırken bu koddaki değere erişebilmeniz iyi bir başlangıçtır. Bu senaryoda yanlış API'yi kullanıyoruz. Şimdi hata ayıklayıcıda kod çalıştırırken bunu düzeltip düzeltemediğini görelim.
Aynı kodda, hata ayıklamaya devam ederken imlecinizi
theGalaxy.GalaxyType
sonuna getirin vetheGalaxy.GalaxyType.MyGType
olarak değiştirin. Düzenlemeyi yapabilmenize rağmen, kod düzenleyicisi size bir hata gösterir (kırmızı dalgalı çizgi). (Visual Basic'te hata gösterilmez ve kodun bu bölümü çalışır.)Geçerli kod satırını yürütmek için F11 (Hata Ayıklama> Adımla'ya veya Hata Ayıklama Araç Çubuğu'ndaki Adımla düğmesine) basın.
F11 hata ayıklayıcıyı birer birer ilerletir (ve kodu yürütür). F10 (Üzerinden Adımla ) benzer bir komutdur ve her ikisi de hata ayıklayıcıyı kullanmayı öğrenirken yararlıdır.
Hata ayıklayıcısını ilerletmeye çalıştığınızda, düzenlemelerin derlenemediğini belirten Hot Reload iletişim kutusu beliriyor.
Düzenlemelerin derlenemiyor olduğunu belirten Düzenle ve Devam Et iletişim kutusu görüntülenir.
Not
Visual Basic örnek kodunda hata ayıklamak için, Hata Ayıklama araç çubuğunda Uygulamayı yeniden başlat düğmesini gösteren Yeniden Başlat
düğmesi.
Düzenle veya Düzenle ve Devam Et ileti kutusunda Hızlı Yeniden Yükleme seçin. Hata Listesi penceresinde bir hata iletisi görürsünüz. Hata,
'object'
MyGType
için bir tanım içermediğini gösterir.Her galaksiyi
GType
türünde bir nesneyle ayarlasak da (MyGType
özelliğine sahiptir), hata ayıklayıcıtheGalaxy
nesnesiniGType
türünde bir nesne olarak tanımaz. Neler oluyor? Galaksi türünü ayarlayan herhangi bir koda bakmak istiyorsunuz. Bunu yaptığınızda,GType
sınıfının kesinlikleMyGType
özelliğine sahip olduğunu ancak bir şeyin doğru olmadığını görürsünüz.object
hakkındaki hata iletisi ipucuna dönüşür; türü, dil yorumlayıcıyaobject
türünde bir nesne yerineGType
türünde bir nesne gibi görünür.Galaksi türünü ayarlamayla ilgili kodunuz üzerinden bakıldığında,
GalaxyType
sınıfınınGalaxy
özelliğininobject
yerineGType
olarak belirtildiğini görürsünüz.public object GalaxyType { get; set; }
Yukarıdaki kodu aşağıdaki gibi değiştirin:
public GType GalaxyType { get; set; }
Hata ayıklama araç çubuğunda Uygulamayı yeniden başlat düğmesini gösteren Yeniden Başlat + düğmesi.
Artık hata ayıklayıcı
Console.WriteLine
üzerinde duraklatıldığında,theGalaxy.GalaxyType.MyGType
üzerine gelerek değerin doğru şekilde ayarlandığını görebilirsiniz.Sol kenar boşluğundaki kesme noktası dairesine tıklayarak kesme noktasını kaldırın (veya sağ tıklayıp kesme noktasını sil >)seçin ve devam etmek için F5 basın.
Uygulama çalışır ve çıkışı görüntüler. Güzel görünüyor, ama bir şey fark ettin. Small Magellanic Cloud galaksisinin konsol çıkışında Düzensiz bir galaksi olarak gösterilmesini bekliyordunuz, ancak hiçbir galaksi türü gösterilmiyor.
Tadpole 400, Spiral Pinwheel 25, Spiral Cartwheel, 500, Lenticular Small Magellanic Cloud .2, Andromeda 3, Spiral Maffei 1, Elliptical
switch
deyiminden önce (Visual Basic'tekiSelect
deyiminden önce) bu kod satırında bir kesme noktası ayarlayın.- C#
- Visual Basic
public GType(char type)
Bu kod, galaksi türünün ayarlandığı yerdir, bu nedenle buna daha yakından bakmak istiyoruz.
Hata ayıklama araç çubuğunda Uygulamayı yeniden başlat düğmesini gösteren Yeniden Başlat + düğmesi.
Hata ayıklayıcı, kesme noktasını ayarladığınız kod satırında duraklatılır.
type
değişkeninin üzerine fareyle gelin.S
değerini görürsünüz (karakter kodunun ardından).I
değeriyle ilgileniyorsunuz, çünkü bunun bir Düzensiz galaksi türü olduğunu biliyorsunuz.F5 tuşlarına basın ve
type
değişkeninin üzerine yeniden gelin.I
değişkenindetype
değerini görene kadar bu adımı yineleyin.Şimdi F11 (Hata Ayıklama>İçeri Gir) basın.
'I' (Visual Basic için deyimi) değeri için
switch
deyimindeki kod satırında durunana kadarSelect
basın. Burada, yazım hatasından kaynaklanan net bir sorun görürsünüz. KodunMyGType
'ı düzensiz galaksi türü olarak ayarladığı yere ilerlemesini bekliyorsunuz, ancak hata ayıklayıcı bunun yerine bu kodu tamamen atlar vedefault
deyimininswitch
bölümünde duraklar (Visual Basic'teElse
deyimi).Koda baktığınızda,
case 'l'
deyiminde bir yazım hatası görürsünüz.case 'I'
olmalıdır.case 'l'
kodunu seçin vecase 'I'
ile değiştirin.Kesme noktanızı kaldırın ve ardından uygulamayı yeniden başlatmak için Yeniden Başlat düğmesini seçin.
Hatalar şimdi düzeltildi ve beklediğiniz Çıktıyı görüyorsunuz!
Uygulamayı bitirmek için herhangi bir tuşa basın.
Özet
Bir sorun gördüğünüzde hata ayıklayıcısını ve adım komutlarını F10 ve F11 gibi kullanarak sorunla ilgili kodun bölgesini bulun.
Not
Sorunun oluştuğu kodun bölgesini tanımlamak zorsa, sorun oluşmadan önce kodda çalışan bir kesme noktası ayarlayın ve ardından sorun bildirimini görene kadar adım komutlarını kullanın. İletileri Çıktı penceresine loglamak için izleme noktalarını da kullanabilirsiniz. Günlüğe kaydedilen iletilere bakarak (ve hangi iletilerin henüz günlüğe kaydedilmediğini fark ederek!), genellikle problemi bulunan kod bölgesini belirleyebilirsiniz. Daraltmak için bu işlemi birkaç kez tekrarlamanız gerekebilir.
Sorunla kod bölgesini bulduğunuzda, araştırmak için hata ayıklayıcısını kullanın. Sorunun nedenini bulmak için hata ayıklayıcıda uygulamanızı çalıştırırken sorun kodunu inceleyin:
değişkenleri inceleyin ve içermeleri gereken değer türünü içerip içermediklerini denetleyin. Hatalı bir değer bulursanız, hatalı değerin nerede ayarlandığını öğrenin (değerin nerede ayarlandığını bulmak için hata ayıklayıcıyı yeniden başlatmanız, çağrı yığınına veya her ikisine de bakmanız gerekebilir).
Uygulamanızın beklediğiniz kodu yürütip yürütmediğini denetleyin. (Örneğin örnek uygulamada,
switch
deyiminin kodunun galaksi türünü Düzensiz olarak ayarlamasını bekliyorduk, ancak uygulama yazım hatası nedeniyle kodu atladı.)
Bahşiş
Hataları bulmanıza yardımcı olması için hata ayıklayıcı kullanırsınız. Hata ayıklama aracı, kodunuzun amacını biliyorsa yalnızca sizin için hataları bulabilir. Bir araç kodunuzun amacını yalnızca geliştirici olarak bu amacı ifade ederseniz bilir. birim testleri yazmak bunu yapmanın yoludur.
Sonraki adımlar
Bu makalede, birkaç genel hata ayıklama kavramını öğrendiniz. Ardından hata ayıklayıcısı hakkında daha fazla bilgi edinmeye başlayabilirsiniz.