Mutlak yeni başlayanlar için hata ayıklama

Başarısız olmadan, yazılım geliştiricileri olarak yazdığımız kod her zaman beklediğimizi yapmaz. 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.

Bir uygulamayı hata ayıklama modu olarak da adlandırılan bir hata ayıklayıcısı 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 kullanarak hata ayıklama moduna girersiniz (veya Hata Ayıklama Başlat>Hata Ayıklama menü komutu veya Hata Ayıklama Araç Çubuğu'ndaki Hata Ayıklamayı Başlat düğmesi).Icon showing Start Debugging button. 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. Kodunuzda ö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ım, hata ayıklayıcıyla kesme noktalarını kullanarak kodunuzu daha dikkatli inceleme fırsatı verdiğiniz yerdir. Kesme noktaları, güvenilir hata ayıklama işleminin en temel ve önemli ö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. ya da imleci bir çizginin üzerine getirin ve F9 tuş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.

  1. 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 Visual Studio indirmeleri sayfasına giderek ücretsiz yükleyin.

    İş yükünü yüklemeniz gerekiyorsa ancak Visual Studio'ya zaten sahipseniz Araçlar Araçları>ve Özellikleri Al'ı seçin. Visual Studio Yükleyicisi başlatılır. .NET masaüstü geliştirme iş yükünü ve ardından Değiştir'i seçin.

  2. Visual Studio'yu açın.

    Başlangıç penceresinde Yeni proje oluştur'u seçin. Arama kutusuna konsol yazın, dil olarak C# veya Visual Basic'i seçin ve ardından .NET için Konsol Uygulaması'nı seçin. İleri öğesini seçin. ConsoleApp_FirstApp gibi bir proje adı yazın ve İleri'yi seçin.

    Önerilen hedef çerçeveyi veya .NET 8'i ve ardından Oluştur'u seçin.

    .NET için Konsol Uygulaması proje şablonunu görmüyorsanız Araçlar Araçları>ve Özellikleri Al'a gidin ve Visual Studio Yükleyicisi açılır. .NET masaüstü geliştirme iş yükünü ve ardından Değiştir'i seçin.

    Visual Studio, sağ bölmedeki Çözüm Gezgini görüntülenen konsol projesini oluşturur.

  3. Program.cs'de (veya Program.vb) 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.)

    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

Kod düzenleyicisinin üzerinde yer alan Hata Ayıklama Araç Çubuğu'nda F5 tuşuna veya Hata Ayıklamayı Başlat düğmesineIcon showing Start Debugging button. basın.

Uygulama başlatılır ve hata ayıklayıcı tarafından bize gösterilen özel durum yoktur. 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 şu çıkışı 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, bunun galaksi türünü depolayan sınıfın adı olduğunu biliyoruz GType . Sınıf adını değil gerçek galaksi türünü ("Spiral" gibi) göstermeye çalışıyoruz!

Uygulamada hata ayıklama

  1. Uygulama çalışmaya devam ediyorken bir kesme noktası ekleyin.

    Bağlam menüsünü almak için yöntemin Console.WriteLine yanına sağ tıklayın ve açılır menüden Kesme Noktası>Ekle Kesme Noktası'nı seçin.

    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.

  2. Hata Ayıklama Araç Çubuğu'nda Yeniden BaşlatIcon showing RestartApp button in Debug toolbar. düğmesini seçin (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).

  3. Sağ taraftaki değişkenin GalaxyType üzerine gelin ve anahtar simgesinin solunda öğesini genişletin theGalaxy.GalaxyType. özelliği içerdiğini GalaxyType ve özellik MyGTypedeğerinin olarak Spiralayarlandığını görürsünüz.

    Screenshot of the Visual Studio Debugger with a line of code in yellow and a menu open below the Galaxy GalaxyType property.

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

  4. Aynı kodda hata ayıklamaya devam ederken imlecinizi sonuna theGalaxy.GalaxyType getirin ve olarak theGalaxy.GalaxyType.MyGTypedeğiştirin. Değişikliği yapabilmenize rağmen, kod düzenleyicisi size bu kodu derleyediğini belirten bir hata gösterir. (Visual Basic'te hata gösterilmez ve kodun bu bölümü çalışır.)

  5. Geçerli kod satırını yürütmek için F11'e (Hata Ayıklama>Adımı veya Hata Ayıklama Araç Çubuğu'ndaki Adımla düğmesi) basın.

    F11 , hata ayıklayıcıyı bir kerede bir deyimle ilerletir (ve kodu yürütür). F10 (AdımLa) benzer bir komutdur ve her ikisi de hata ayıklayıcıyı kullanmayı öğrenirken yararlıdır.

    Düzenlemelerin derlenemiyor olduğunu belirten Düzenle ve Devam Et iletişim kutusu görüntülenir.

    Screenshot of the Visual Studio Debugger with a line of code highlighted in red and a message box with the Edit option selected.

    Dekont

    Visual Basic örnek kodunda hata ayıklamak için, Yeniden BaşlatIcon showing Restart app button in Debug toolbar. düğmesine tıklamanız gerekene kadar sonraki birkaç adımı atlayın.

  6. Düzenle ve Devam Et ileti kutusunda Düzenle'yi seçin. Hata Listesi penceresinde bir hata iletisi görürsünüz. Hata, öğesinin 'object' için MyGTypebir tanım içermediğini gösterir.

    Screenshot of the Visual Studio Debugger with a line of code highlighted in red and an Error List window with two errors listed.

    Her galaksiyi türünde GType bir nesneyle ayarlamış olsak da (özelliği vardırMyGType), hata ayıklayıcı nesneyi türünde GTypebir nesne olarak tanımaztheGalaxy. Neler oluyor? Galaksi türünü ayarlayan herhangi bir koda bakmak istiyorsunuz. Bunu yaptığınızda, sınıfın GType kesinlikle özelliğine MyGTypesahip olduğunu ancak bir şeyin doğru olmadığını görürsünüz. hakkındaki object hata iletisi ipucu olduğu ortaya çıkar; dil yorumlayıcısı için, türü türünde bir nesne yerine türünde object bir nesne GTypegibi görünür.

  7. Galaksi türünü ayarlamayla ilgili kodunuz incelendiğinde sınıfının özelliğinin yerine GTypeolarak object belirtildiğini Galaxy görürsünüzGalaxyType.

    public object GalaxyType { get; set; }
    
  8. Yukarıdaki kodu aşağıdaki gibi değiştirin:

    public GType GalaxyType { get; set; }
    
  9. Kodu yeniden derlemek ve yeniden başlatmak için Hata Ayıklama Araç Çubuğu'nda (Ctrl + Shift + F5) Yeniden BaşlatIcon showing Restart app button in Debug toolbar. düğmesini seçin.

    Artık hata ayıklayıcı üzerinde Console.WriteLineduraklatıldığında üzerine gelebilir theGalaxy.GalaxyType.MyGTypeve değerin düzgün ayarlandığını görebilirsiniz.

  10. 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'i seçin) ve devam etmek için F5 tuşuna basın.

    Uygulama çalışır ve çıkışı görüntüler. Güzel görünüyor, ama bir şey fark ettin. Konsol çıkışında Small Magellanic Cloud galaksisinin Düzensiz bir galaksi olarak gösterilmesini bekliyorsunuz, ancak hiçbir galaksi türü gösterilmemiş.

    Tadpole  400,  Spiral
    Pinwheel  25,  Spiral
    Cartwheel, 500,  Lenticular
    Small Magellanic Cloud .2,
    Andromeda  3,  Spiral
    Maffei 1,  Elliptical
    
  11. Bu kod satırında deyiminden önce switch (Visual Basic'teki deyiminden Select önce) bir kesme noktası ayarlayın.

    public GType(char type)
    

    Bu kod, galaksi türünün ayarlandığı yerdir, bu nedenle buna daha yakından bakmak istiyoruz.

  12. Yeniden başlatmak için Hata Ayıklama Araç Çubuğu'nda (Ctrl + Shift + F5) Yeniden BaşlatIcon showing Restart app button in Debug toolbar. düğmesini seçin.

    Hata ayıklayıcı, kesme noktasını ayarladığınız kod satırında duraklatılır.

  13. Değişkenin type üzerine gelin. değerini S görürsünüz (karakter kodunu izleyerek). Düzensiz bir galaksi türü olduğunu bildiğiniz için değeriyle Iilgileniyorsunuz.

  14. F5 tuşuna basın ve değişkenin type üzerine yeniden gelin. değişkeninde değerini I görene type kadar bu adımı yineleyin.

    Screenshot of the Visual Studio Debugger with a line of code in yellow and a window with the type variable value of 73 I.

  15. Şimdi F11 tuşuna basın (hata ayıklama>adımı içine).

  16. 'I' değeri (Select Visual Basic deyimi) için deyimindeki switch kod satırında durunana kadar F11 tuşuna basın. Burada, yazım hatasından kaynaklanan net bir sorun görürsünüz. Kodun Düzensiz galaksi türü olarak ayarlandığı MyGType yere ilerlemesini bekliyorsunuz, ancak hata ayıklayıcı bunun yerine bu kodu tamamen atlar ve deyiminin switch (ElseVisual Basic'teki deyimi) bölümünde duraklardefault.

    Screenshot showing the typo error.

    Koda baktığınızda deyiminde case 'l' bir yazım hatası görürsünüz. case 'I' olmalıdır.

  17. için case 'l' kodu seçin ve ile case 'I'değiştirin.

  18. Kesme noktanızı kaldırın ve 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 F10 ve F11 gibi adım komutlarını kullanarak sorunla ilgili kod bölgesini bulun.

Dekont

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 Çıkış penceresinde günlüğe kaydetmek 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 kod bölgesini sorunla yalıtabilirsiniz. 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 bakmanız veya her ikisini birden yapmanız gerekebilir).

  • Uygulamanızın beklediğiniz kodu yürütip yürütmediğini denetleyin. (Örneğin, örnek uygulamada deyiminin kodunun switch 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ı, yalnızca kodunuzun amacını biliyorsa sizin için hataları bulabilir. Bir araç kodunuzun amacını yalnızca geliştirici olarak bu amacı ifade ederseniz bilir. Birim testleri yazmak bunu nasıl yapacağınızı gösterir.

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.