Aracılığıyla paylaş


Çok iş parçacıklı uygulamalarda hata ayıklamaya başlama (C#, Visual Basic, C++)

Visual Studio, çok iş parçacıklı uygulamalarda hata ayıklamanıza yardımcı olmak için çeşitli araçlar ve kullanıcı arabirimi öğeleri sağlar. Bu öğreticide iş parçacığı işaretçilerinin, Paralel Yığınlar penceresinin, Paralel İzleme penceresinin, koşullu kesme noktalarının ve filtre kesme noktalarının nasıl kullanılacağı gösterilmektedir. Bu öğreticiyi tamamladığınızda, çok iş parçacıklı uygulamalarda hata ayıklamaya yönelik Visual Studio özellikleri hakkında bilgi edinebilirsiniz.

Bu iki makale, diğer çok iş parçacıklı hata ayıklama araçlarını kullanma hakkında ek bilgi sağlar:

  • Hata Ayıklama Konumu araç çubuğunu ve İş Parçacıkları penceresini kullanmak için bkz. İzlenecek Yol: Çok iş parçacıklı uygulamada hata ayıklama.

  • (yönetilen kod) ve eşzamanlılık çalışma zamanı (C++) kullanan Task bir örnek için bkz . İzlenecek yol: Paralel uygulamada hata ayıklama. Çoğu çok iş parçacıklı uygulama türü için geçerli olan genel hata ayıklama ipuçları için hem bu makaleyi hem de bu makaleyi okuyun.

İlk adım, çok iş parçacıklı bir uygulama projesi oluşturmaktır.

Çok iş parçacıklı uygulama projesi oluşturma

  1. Visual Studio'yu açın ve yeni bir proje oluşturun.

    Başlangıç penceresi açık değilse Dosya>Başlangıç Penceresi'ni seçin.

    Başlangıç penceresinde Yeni proje oluştur'u seçin.

    Yeni proje oluştur penceresinde, arama kutusuna konsol girin veya yazın. Ardından, Dil listesinden C#, C++ veya Visual Basic'i seçin ve ardından Platform listesinden Windows'u seçin.

    Dil ve platform filtrelerini uyguladıktan sonra .NET veya C++ için Konsol Uygulaması şablonunu ve ardından İleri'yi seçin.

    Not

    Doğru şablonu görmüyorsanız Araçlar Araç>ve Özellik Al...'e gidin ve Visual Studio Yükleyicisi açın. .NET masaüstü geliştirme veya C++ ile masaüstü geliştirme iş yükünü ve ardından Değiştir'i seçin.

    Yeni projenizi yapılandırın penceresinde, Proje adı kutusuna MyThreadWalkthroughAppyazın veya girin. Ardından, hangi seçenek varsa İleri'yi veya Oluştur'u seçin.

    .NET Core veya .NET 5+ projesi için önerilen hedef çerçeveyi veya .NET 8'i ve ardından Oluştur'u seçin.

    Yeni bir konsol projesi görüntülenir. Proje oluşturulduktan sonra bir kaynak dosya görüntülenir. Seçtiğiniz dile bağlı olarak, kaynak dosya Program.cs, MyThreadWalkthroughApp.cpp veya Module1.vb olarak adlandırılabilir.

  2. Kaynak dosyada görüntülenen kodu silin ve aşağıdaki güncelleştirilmiş kodla değiştirin. Kod yapılandırmanız için uygun kod parçacığını seçin.

    using System;
    using System.Threading;
    
    public class ServerClass
    {
    
        static int count = 0;
        // The method that will be called when the thread is started.
        public void InstanceMethod()
        {
            Console.WriteLine(
                "ServerClass.InstanceMethod is running on another thread.");
    
            int data = count++;
            // Pause for a moment to provide a delay to make
            // threads more apparent.
            Thread.Sleep(3000);
            Console.WriteLine(
                "The instance method called by the worker thread has ended. " + data);
        }
    }
    
    public class Simple
    {
        public static void Main()
        {
            for (int i = 0; i < 10; i++)
            {
                CreateThreads();
            }
        }
        public static void CreateThreads()
        {
            ServerClass serverObject = new ServerClass();
    
            Thread InstanceCaller = new Thread(new ThreadStart(serverObject.InstanceMethod));
            // Start the thread.
            InstanceCaller.Start();
    
            Console.WriteLine("The Main() thread calls this after "
                + "starting the new InstanceCaller thread.");
    
        }
    }
    
  3. Dosya menüsünde Tümünü Kaydet’i seçin.

  4. (Yalnızca Visual Basic) Çözüm Gezgini (sağ bölme) bölümünde proje düğümüne sağ tıklayın ve Özellikler'i seçin. Uygulama sekmesinin altında Başlangıç nesnesini Basit olarak değiştirin.

Çok iş parçacıklı uygulamada hata ayıklama

  1. Kaynak kod düzenleyicisinde aşağıdaki kod parçacığını arayın:

    Thread.Sleep(3000);
    Console.WriteLine();
    
  2. Yeni bir kesme noktası eklemek için veya, C++ std::this_thread::sleep_for deyiminin Thread.Sleep sol oluğuna sol tıklayın.

    Cilt payı içinde, kırmızı daire bu konumda bir kesme noktası ayarlandığını gösterir.

  3. Hata Ayıkla menüsünde Hata Ayıklamayı Başlat (F5) öğesini seçin.

    Visual Studio çözümü oluşturur, uygulama hata ayıklayıcı ekli olarak çalışmaya başlar ve kesme noktasında durur.

  4. Kaynak kodu düzenleyicisinde kesme noktasını içeren satırı bulun.

İş parçacığı işaretçisini bulma

  1. Hata Ayıklama Araç Çubuğu'nda, Kaynakta İş Parçacıklarını Göster düğmesini Kaynakta İş Parçacıklarını Gösterseçin.

  2. Hata ayıklayıcıyı ilerletmek için F11 tuşuna iki kez basın.

  3. Pencerenin sol tarafındaki oluklara bakın. Bu satırda, iki bükülmüş iş parçacığına benzeyen bir iş parçacığı işaretçisi simgesine İş Parçacığı İşaretçisi dikkat edin. İş parçacığı işaretçisi, bir iş parçacığının bu konumda durdurulduğunu gösterir.

    İş parçacığı işaretçisi bir kesme noktası tarafından kısmen gizlenebilir.

  4. İşaretçiyi iş parçacığı işaretçisinin üzerine getirin. Durdurulan her iş parçacığının adını ve iş parçacığı kimlik numarasını belirten bir Veri İpucu görüntülenir. Bu durumda, adı büyük olasılıkla <noname>şeklindedir.

    Veri İpucundaki İş Parçacığı Kimliğinin ekran görüntüsü.

  5. Kısayol menüsünde kullanılabilir seçenekleri görmek için iş parçacığı işaretçisini seçin.

İş parçacığı konumlarını görüntüleme

Paralel Yığınlar penceresinde, İş Parçacıkları görünümü ile (görev tabanlı programlama için) Görevler görünümü arasında geçiş yapabilir ve her iş parçacığı için çağrı yığını bilgilerini görüntüleyebilirsiniz. Bu uygulamada İş Parçacıkları görünümünü kullanabiliriz.

  1. Windows>Paralel Yığınlarında Hata Ayıklama'ya>tıklayarak Paralel Yığınlar penceresini açın. Aşağıdakine benzer bir şey görmeniz gerekir. Her iş parçacığının geçerli konumuna, donanımınıza ve programlama dilinize bağlı olarak tam bilgiler farklılık gösterebilir.

    Paralel Yığınlar Penceresinin ekran görüntüsü.

    Bu örnekte, soldan sağa yönetilen kod için şu bilgileri görüyoruz:

    • Geçerli iş parçacığı (sarı ok) girdi ServerClass.InstanceMethod. üzerine gelerek ServerClass.InstanceMethodbir iş parçacığının iş parçacığı kimliğini ve yığın çerçevesini görüntüleyebilirsiniz.
    • İş parçacığı 31724, İş Parçacığı 20272'ye ait bir kilidi bekliyor.
    • Dış Kodu Göster'i seçerseniz ayrıntılı olarak görüntüleyebileceğiniz [Dış Kod] üzerinde Ana iş parçacığı (sol taraf) durduruldu.

    Paralel Yığınlar Penceresi

    Bu örnekte, soldan sağa yönetilen kod için şu bilgileri görüyoruz:

    • Ana iş parçacığı (sol taraf) üzerinde Thread.Startdurduruldu; burada durdurma noktası, iş parçacığı işaretçi simgesiyle İş Parçacığı İşaretçisitanımlanır.
    • İki iş parçacığı girdi ServerClass.InstanceMethod, bunlardan biri geçerli iş parçacığı (sarı ok), diğer iş parçacığı ise içinde Thread.Sleepdurdu.
    • Yeni bir iş parçacığı da (sağda) başlatılıyor ancak üzerinde ThreadHelper.ThreadStartdurduruldu.
  2. İş parçacıklarını liste görünümünde görüntülemek için Windows>İş Parçacıklarında Hata Ayıklama'yı>seçin.

    İş Parçacıkları Penceresinin ekran görüntüsü.

    Bu görünümde, iş parçacığı 20272'nin Main iş parçacığı olduğunu ve şu anda dış kodda, özellikle System.Console.dll olduğunu kolayca görebilirsiniz.

    Not

    İş Parçacıkları penceresini kullanma hakkında daha fazla bilgi için bkz. İzlenecek Yol: Çok İş Parçacıklı Uygulamada Hata Ayıklama.

  3. Kısayol menüsündeki kullanılabilir seçenekleri görmek için Paralel Yığınlar veya İş Parçacıkları penceresindeki girdilere sağ tıklayın.

    Bu sağ tıklama menülerinden çeşitli eylemler gerçekleştirebilirsiniz. Bu öğreticide, Paralel İzleme penceresinde (sonraki bölümlerde) bu ayrıntıların daha fazlasını keşfedersiniz.

Değişkende saat ayarlama

  1. Windows>Parallel Watch Parallel Watch 1'de Hata Ayıkla'ya>tıklayarak Parallel Watch>penceresini açın.

  2. Metni gördüğünüz hücreyi <Add Watch> (veya dördüncü sütundaki boş üst bilgi hücresini) seçin ve girin data.

    Her iş parçacığı için veri değişkeninin değerleri pencerede görünür.

  3. Metni gördüğünüz hücreyi <Add Watch> (veya beşinci sütundaki boş üst bilgi hücresini) seçin ve girin count.

    Her iş parçacığı için değişkenin count değerleri pencerede görünür. Henüz bu kadar bilgi görmüyorsanız, hata ayıklayıcıdaki iş parçacıklarının yürütülmesini ilerletmek için F11'e birkaç kez basmayı deneyin.

    Paralel İzleme Penceresi

  4. Kullanılabilir seçenekleri görmek için penceredeki satırlardan birine sağ tıklayın.

İş parçacıklarını bayrakla işaretleme ve işareti geri alma

Önemli iş parçacıklarını izlemek ve diğer iş parçacıklarını yoksaymak için iş parçacıklarına bayrak ekleyebilirsiniz.

  1. Paralel İzleme penceresinde Shift tuşunu basılı tutun ve birden çok satır seçin.

  2. Sağ tıklayın ve Bayrak'ı seçin.

    Seçilen tüm iş parçacıklarına bayrak eklenir. Artık yalnızca bayrak eklenmiş iş parçacıklarını gösterecek şekilde filtreleyebilirsiniz.

  3. Paralel İzleme penceresinde Yalnızca Bayrak eklenmiş İş Parçacıklarını Göster düğmesini Bayrak eklenmiş İş Parçacıklarını Gösterseçin.

    Listede yalnızca bayrak eklenmiş iş parçacıkları görüntülenir.

    İpucu

    Bazı iş parçacıklarına bayrak ekledikten sonra, kod düzenleyicisinde bir kod satırına sağ tıklayabilir ve Bayrak eklenmiş İş Parçacıklarını İmleçte Çalıştır'ı seçebilirsiniz. Tüm bayraklı iş parçacıklarının ulaşacağı kodu seçtiğinizden emin olun. Visual Studio, iş parçacıklarını seçilen kod satırında duraklatarak iş parçacıklarını dondurup çözerek yürütme sırasını denetlemeyi kolaylaştırır.

  4. Tüm İş Parçacıklarını Göster moduna geri dönmek için Yalnızca Bayrak eklenmiş İş Parçacıklarını Göster düğmesini yeniden seçin.

  5. İş parçacıklarını kaldırmak için Paralel İzleme penceresinde bir veya daha fazla bayrak eklenmiş iş parçacığına sağ tıklayın ve Şişirme'yi seçin.

İş parçacığı yürütmeyi dondurma ve çözme

İpucu

İş parçacıklarının çalışma sırasını denetlemek için iş parçacıklarını dondurabilir ve çözebilirsiniz (askıya alıp sürdürebilirsiniz). Bu, kilitlenmeler ve yarış koşulları gibi eşzamanlılık sorunlarını çözmenize yardımcı olabilir.

  1. Paralel İzleme penceresinde, tüm satırlar seçili durumdayken sağ tıklayın ve Dondur'u seçin.

    İkinci sütunda, her satır için bir duraklatma simgesi görüntülenir. Duraklatma simgesi, iş parçacığının dondurulduğunu gösterir.

  2. Yalnızca bir satır seçerek diğer tüm satırların seçimini kaldırın.

  3. Bir satıra sağ tıklayın ve Çöz'e tıklayın.

    Bu satırdaki duraklatma simgesi kaybolur ve bu da iş parçacığının artık dondurulmadığını gösterir.

  4. Kod düzenleyicisine geçin ve F11 tuşuna basın. Yalnızca çözülmemiş iş parçacığı çalışır.

    Uygulama ayrıca bazı yeni iş parçacıklarını da başlatabilir. Yeni iş parçacıklarının hiçbiri iltihapsız ve dondurulmuyor.

Koşullu kesme noktalarıyla tek bir iş parçacığını izleme

Hata ayıklayıcıda tek bir iş parçacığının yürütülmesini izlemek yararlı olabilir. Bunun bir yolu, ilgilenmediğiniz iş parçacıklarını dondurmaktır. Bazı senaryolarda, örneğin belirli bir hatayı yeniden oluşturmak için diğer iş parçacıklarını dondurmadan tek bir iş parçacığını izlemeniz gerekebilir. Diğer iş parçacıklarını dondurmadan bir iş parçacığını takip etmek için, ilgilendiğiniz iş parçacığı dışında koda girmekten kaçınmanız gerekir. Koşullu kesme noktası ayarlayarak bu görevi gerçekleştirebilirsiniz.

İş parçacığı adı veya iş parçacığı kimliği gibi farklı koşullarda kesme noktaları ayarlayabilirsiniz. Her iş parçacığı için benzersiz olduğunu bildiğiniz verilerde koşulu ayarlamak yararlı olabilir. Bu yaklaşım, belirli bir veri değeriyle herhangi bir iş parçacığından daha çok ilgilendiğinizde hata ayıklama sırasında yaygındır.

  1. Daha önce oluşturduğunuz kesme noktasına sağ tıklayın ve Koşullar'ı seçin.

  2. Kesme Noktası Ayarlar penceresinde koşullu ifade için girindata == 5.

    Koşullu Kesme Noktası

    İpucu

    Belirli bir iş parçacığıyla daha çok ilgileniyorsanız, koşul için bir iş parçacığı adı veya iş parçacığı kimliği kullanın. Bunu Kesme Noktası Ayarlar penceresinde yapmak için Koşullu ifade yerine Filtre'yi seçin ve filtre ipuçlarını izleyin. Hata ayıklayıcıyı yeniden başlattığınızda iş parçacığı kimlikleri değiştikçe uygulama kodunuzda iş parçacıklarınızı adlandırmak isteyebilirsiniz.

  3. Kesme noktası Ayarlar penceresini kapatın.

  4. Hata ayıklama oturumunuzu yeniden başlatmak için Yeniden Başlat Uygulamayı Yeniden Başlat düğmesini seçin.

    Veri değişkeninin değerinin 5 olduğu iş parçacığında koda bölün. Paralel İzleme penceresinde, geçerli hata ayıklayıcısı bağlamını gösteren sarı oku arayın.

  5. Artık kodun (F10) üzerine gelebilir ve koda (F11) adımlayabilir ve tek iş parçacığının yürütülmesini izleyebilirsiniz.

    Kesme noktası koşulu iş parçacığına özgü olduğu ve hata ayıklayıcının diğer iş parçacıklarındaki diğer kesme noktalarına isabet etmemesi (bunları devre dışı bırakmanız gerekebilir) sürece, diğer iş parçacıklarına geçmeden kodun üzerine geçebilir ve koda adım atabilirsiniz.

    Not

    Hata ayıklayıcıyı ilerlettiğinızda, tüm iş parçacıkları çalışır. Ancak, hata ayıklayıcısı diğer iş parçacıklarından biri kesme noktasına isabet etmediği sürece diğer iş parçacıklarında koda bölünemez.