Alıştırma - Visual Studio ile hata ayıklama

Tamamlandı

Yeni edinilen hata ayıklama bilgilerinizi uygulamaya geçirmenin zamanı geldi. bu işteki ilk gününüz ve şirketin en önemli ürünü olan Fibonacci hesaplayıcısındaki bir hatayı düzelterek .NET hata ayıklama becerilerinizi ortaya koymak istiyorsunuz.

Hata ayıklama için örnek bir .NET projesi oluşturma

.NET hata ayıklaması için Visual Studio'yu ayarlamak için öncelikle bir .NET projesine ihtiyacımız var. Visual Studio, yeni proje oluşturmayı kolaylaştıran birçok başlangıç şablonu sağlar.

  1. Visual Studio'da DosyaYeni Proje'yi>> seçin.

  2. Yeni proje oluştur iletişim kutusunda Konsol Uygulaması'nı ve ardından İleri'yi seçin.

  3. Projeye DotNetDebugging adını verin ve kaydetmek istediğiniz konumu seçin. Diğer değerleri varsayılan değerlerinde bırakın ve İleri'yi seçin.

  4. Son ekranda Oluştur'u seçin.

Visual Studio, seçtiğimiz şablonu kullanarak Konsol projesini oluşturur. Proje yüklendikten sonra seçerek Program.cs açın.

Fibonacci program mantığını ekleme

Şu anki projemiz konsola "Merhaba Dünya" mesajı yazıyor, bu nedenle hata ayıklayacak çok şeyimiz yok. Bunun yerine, Fibonacci dizisinin N. sayısını hesaplamak için kısa bir .NET programı kullanalım.

Fibonacci dizisi, 0 ve 1 ile başlayan ve her sayının kendisinden önce gelen iki sayının toplamı olduğu bir sayı dizisidir. Sıra burada gösterildiği şekilde devam eder:

0, 1, 1, 2, 3, 5, 8, 13, 21...

Aşağıdaki örnek kod bir hata içerdiğinden sorunu tanılamak ve çözmek için Visual Studio'nun hata ayıklama araçlarını kullanalım.

  1. Program.cs dosyasının içeriğini aşağıdaki kodla değiştirin:
int result = Fibonacci(5);
Console.WriteLine(result);

static int Fibonacci(int n)
{
    Console.WriteLine("The output is: ");
    int n1 = 0;
    int n2 = 1;
    int sum;

    for (int i = 2; i < n; i++)
    {
        sum = n1 + n2;
        n1 = n2;
        n2 = sum;
    }

    return n == 0 ? n1 : n2;
}

Not

Bu kod, bu modülde daha sonra ayıklayacağımız bir hata içeriyor. Bu hata düzeltilene kadar, söz konusu kodu görev açısından kritik Fibonacci uygulamalarında kullanmamanızı öneririz.

  1. Dosyayı Windows ve Linux için Ctrl+S tuşlarıyla kaydedin. Mac için Cmd+S tuşlarını seçin.

  2. Hata ayıklamadan önce güncelleştirilmiş kodun işleyişine göz atalım. Visual Studio komut çubuğundaki yeşil başlangıç düğmesine basarak programı çalıştırın.

  3. Hata ayıklama konsolu çıkışının sonunda, programın konsola 3 yazdığını ve ardından 0 koduyla çıktığını görebilirsiniz. Genellikle program çıkış kodu 0 olduğunda, bu durum programın çalıştığını ve kilitlenmeden kapandığını gösterir. Ancak, çökme ve doğru değer döndürme arasında bir fark vardır.

Değiştirilmiş program çıkışını içeren Terminal penceresi.

Bu örnekte, programın Fibonacci dizisinin beşinci değerini hesaplamasını istemiştik:

0, 1, 1, 2, 3, 5, 8, 13, 21...

Bu listedeki beşinci değer 5 olmasına rağmen programımız 3 değerini döndürdü. Bu hatayı tanılayıp düzeltmek için hata ayıklayıcıyı kullanalım.

Kesme noktalarını ve adım adım yürütmeyi kullanma

  1. üzerinde 1int result = Fibonacci(5);sol kenar boşluğuna tıklayarak kesme noktası ekleyin.

  2. Hata ayıklamayı yeniden başlatın. Program yürütülmeye başlar. Ayarladığınız kesme noktası nedeniyle yürütme duraklatılarak 1. satırda kırılır. Fibonacci() işlevine geçmek için hata ayıklayıcı denetimlerini kullanın.

    İçine adımla düğmesinin ekran görüntüsü.

Değişkenlerin durumunu denetleme

Şimdi, Locals penceresini kullanarak farklı değişkenlerin değerlerini incelemek için biraz zaman ayırabilirsiniz.

Yerel Ayarlar panelinin ekran görüntüsü.

  • n parametresi için gösterilen değer nedir?
  • İşlevin yürütülmesinin başında n1, n2 ve sum yerel değişkenlerinin değerleri neydi?
  1. Daha sonra for hata ayıklama komutunu kullanarak döngüsüne ilerleyeceğiz.

    Adım at düğmesinin ekran görüntüsü.

  2. for döngüsünün içindeki ilk satıra ulaşana kadar ilerlemeye devam edin. Şu şekilde başlayan satır:

    sum = n1 + n2;
    

Not

Satırda for(...) {} gezinmek için komutlarda birden çok adım gerektiğini fark edebilirsiniz. Bu durum, bu satırda birden çok deyim olmasından kaynaklanır. İlerlediğinizde, kodunuzda sonraki ifadeye geçersiniz. Genellikle her satırda bir deyim bulunur. Eğer durum böyle değilse, bir sonraki satıra geçmek için birden fazla adıma ihtiyaç duyarsınız.

Kodu düşünün

Hata ayıklamanın önemli bir kısmı, ara vermek ve kod parçalarının (döngüler gibi işlevler ve bloklar) ne yapmaya çalıştığına ilişkin bilgiye dayalı tahminler yapmaktır. Emin değilseniz sorun değil, bu da hata ayıklama sürecinin bir parçasıdır. Ancak hata ayıklama işlemine etkin bir şekilde girişmiş olmak hataları çok daha hızlı bulmanıza yardımcı olur.

Ayrıntılara ilerlemeden önce, Fibonacci dizisinin 0 ve 1 ile başlayan ve her sayının kendisinden önce gelen iki sayının toplamı olduğu bir sayı dizisi olduğunu anımsayalım.

Bunun anlamı:

Fibonacci(0) = 0
Fibonacci(1) = 1
Fibonacci(2) = 1 (0 + 1)
Fibonacci(3) = 2 (1 + 1)
Fibonacci(4) = 3 (1 + 2)
Fibonacci(5) = 5 (2 + 3)

Bu tanımı anlayıp bu for döngüsüne bakarak şunu çıkarabiliriz:

  1. Döngü 2 ila n (aradığımız Fibonacci dizisi sayısı) arasındaki sayıları sayıyor:
  2. n değeri 2'den küçükse, döngü hiçbir zaman çalışmaz. İşlevin return sonundaki deyim 0 ise n 0, 1 veya 2 ise n 1 döndürür. Bu değerler fibonacci serisindeki sıfır, ilk ve ikinci değerlerdir.
  3. n 2'den büyük olduğunda daha ilgi çekici bir durum ortaya çıkar. Bu durumlarda, geçerli değer önceki iki değerin toplamı olarak tanımlanır. Yani bu döngüde, önceki iki değer n1 ve n2, geçerli yineleme değeri ise sum olur. Bu mantık nedeniyle, önceki iki değerin toplamını her seferinde bulup sum olarak ayarladığımızda, n1 ve n2 değerlerimizi güncelleriz.

Bunun üzerinde daha fazla düşünmemiz gerekmiyor. Hata ayıklayıcımıza biraz güvenebiliriz. Ancak kod üzerine düşünmek ve beklediğimiz işlemi yapıp yapmadığını görmek, yapmadığında ise buna dair bilgi sahibi olmak önemlidir.

Hatayı kesme noktalarıyla belirle

Kodunuzu adım adım incelemek faydalı olabilir, ancak zahmetlidir. Özellikle döngülerle veya tekrar tekrar çağrılan başka bir kodla çalışırken. Döngüde defalarca ilerlemek yerine, döngünün ilk satırında bir kesme noktası ayarlayabiliriz.

Kesme noktalarımızı nereye koyduğumuz konusunda stratejik olmak önemlidir. Geçerli en yüksek Fibonacci değerini temsil ettiğinden, sum değeriyle özel olarak ilgileniyoruz. Bu nedenle, kesme noktamızı ayarlandıktan sonrasum satıra yerleştirelim.

  1. 14. satıra ikinci bir kesme noktası ekleyin.

    İkinci kesme noktasının ayarlandığını gösteren ekran görüntüsü.

    Not

    Kodunuzu çalıştırmaya devam edip bir veya iki satır atladığınızı fark ederseniz kesme noktalarınızı daha verimli satırlarla kolayca güncelleştirebilirsiniz.

  2. Artık döngüde iyi bir kesme noktası ayarladığımıza göre, kesme noktasına isabet edene kadar ilerlemek için hata ayıklayıcı denetimlerinde Devam'ı seçin. Yerel değişkenlerimize baktığımızda aşağıdaki satırları görüyoruz:

    n [int]: 5
    n1 [int]: 0
    n2 [int]: 1
    sum [int]: 1
    i [int]: 2
    

    Bu satırların hepsi doğru görünüyor. Döngüdeki ilk zaman noktasında, önceki iki değerin sum değeri 1’dir. Satır satır ilerlemek yerine, döngüdeki sonraki zaman noktasına atlamak için kesme noktalarımızdan yararlanabiliriz.

  3. Sonraki kesme noktasına (döngüdeki bir sonraki geçiş) ulaşana kadar program akışını devam ettirmek için Devam Et’i seçin.

    Not

    Devam Et seçeneğini kullandığınızda hatayı atlayabileceğiniz konusunda endişelenmeyin. Sorunu bulmak için kodda birkaç kez hata ayıklayabilirsiniz. Birkaç kez yapmak, genellikle çok dikkatli bir şekilde adımlamaya kıyasla daha hızlı olur.

    Bu kez, aşağıdaki değerleri görüyoruz:

    n [int]: 5
    n1 [int]: 1
    n2 [int]: 1
    sum [int]: 2
    i [int]: 3
    

    Bu değerler hala mantıklı mı? Öyle görünüyor. Üçüncü Fibonacci sayısı için, sum değerimizin 2’ye eşit olmasını bekliyoruz ve öyle olduğunu görüyoruz.

  4. Yeniden döngüye almak için Devam'ı seçin.

    n [int]: 5
    n1 [int]: 1
    n2 [int]: 2
    sum [int]: 3
    i [int]: 4
    

    Sonuç doğru. Dizideki dördüncü değerin 3 olmasını bekliyoruz.

  5. Bu noktada, kodun aslında tamamen sorunsuz olduğunu ve hatanın hayal ürününüz olduğunu düşünmeye başlamış olabilirsiniz. Döngüyü son bir kez daha tekrarlayalım. Bir kez daha Devam Et’i seçin.

    Programın çalışması tamamlandı ve çıkış 3! Sonucumuz yanlış.

    Artık kodun i değeri 4’e eşit olana kadar döngüde düzgün bir şekilde çalıştığını, ancak son değeri hesaplamadan programdan çıktığını biliyoruz. Hatanın yerini belirledik.

  6. Şimdi 18. satırda şu şekilde bir kesme noktası daha ayarlayalım:

    return n == 0 ? n1 : n2;
    

    Bu kesme noktası, işlevden çıkmadan önce program durumunu incelememize olanak tanır. 1. ve 13. satırlardaki önceki kesme noktalarımızdan bekleyebileceğiniz her şeyi zaten öğrendik, böylece bunları temizleyebiliyoruz.

  7. 1. ve 13. satırlardaki önceki kesme noktalarımızı kaldırın. Satır numaralarının yanındaki kenar boşluğunda kesme noktalarını seçin veya sol alttaki kesme noktaları bölmesindeki 1. ve 13. satırlar için kesme noktası onay kutularını temizleyin.

    Kesme noktaları bölmesinde listelenen kesme noktalarının gösterildiği ekran görüntüsü.

    Artık neler olduğunu daha iyi anladığımıza göre, programımızın yanlış davranışlarını yakalamak için tasarlanmış bir kesme noktası ayarladık. Şimdi bu hatayı yakalayabilmeliyiz!

  8. Hata ayıklayıcıyı son kez çalıştırın.

    n [int]: 5
    n1 [int]: 2
    n2 [int]: 3
    sum [int]: 3
    

    Fibonacci(5) istediğimiz halde, yanlışlıkla Fibonacci(4) aldık ki bu yanlıştı. Bu işlev n2 değerini döndürür, her döngü yinelemesi sum değerini hesaplar ve n2 değerini sum değerine eşit olacak şekilde ayarlar.

    Bu bilgileri ve önceki hata ayıklama çalıştırmamızı temel alarak, döngünün i değeri 5 değil, 4 olduğunda çıkış yaptığını görebiliriz.

    Şimdi döngü deyimimize for biraz daha yakından bakalım.

    for (int i = 2; i < n; i++)
    

    Bu mantık, for döngüsünün üst kısmı i değerini n olarak gördüğünde, programın hemen çıkmasına neden olur. Bu, i'ın n'e eşit olduğu durum için döngü kodunun çalışmadığı anlamına gelir. i <= n değerine ulaşana kadar çalıştırmak istiyorduk, ancak bunun yerine şu senaryo gerçekleşiyor:

    for (int i = 2; i <= n; i++)
    

    Yani bu değişiklikle birlikte, güncelleştirilmiş programınızın bu örnekteki gibi görünmesi gerekir:

    int result = Fibonacci(5);
    Console.WriteLine(result);
    
    static int Fibonacci(int n)
    {
        Console.WriteLine("The output is: ");
        int n1 = 0;
        int n2 = 1;
        int sum;
    
        for (int i = 2; i <= n; i++)
        {
            sum = n1 + n2;
            n1 = n2;
            n2 = sum;
        }
    
        return n == 0 ? n1 : n2;
    }
    
  9. Henüz yapmadıysanız hata ayıklama oturumunu durdurun.

  10. Önceki değişikliği 11. satırda yapın ve kesme noktanızı 18. satırda bırakın.

  11. Hata ayıklayıcıyı yeniden başlatın. Bu kez, 18. satırdaki kesme noktasına bastığımızda aşağıdaki değerleri görürüz:

    n [int]: 5
    n1 [int]: 3
    n2 [int]: 5
    sum [int]: 5
    

    Selam! Bu kez başardık! Harika bir iş, Fibonacci, Inc. için günü kurtardın!

  12. Programın doğru değeri döndürdüğünden emin olmak için Devam Et’i seçin.

    5
    The program '[105260] DotNetDebugging.dll' has exited with code 0 (0x0).
    

    Böylece doğru çıktıyı veriyor.

Başardınız! Visual Studio'da .NET hata ayıklayıcısını kullanarak yazmadığınız bazı kodlarda hata ayıkladınız.

Bir sonraki ünitede, .NET'te yerleşik olarak bulunan günlüğe kaydetme ve izleme özelliklerini kullanarak yazdığınız kodun hatalarını ayıklamayı nasıl kolaylaştıracağınızı öğreneceksiniz.