Aynı kodla çalışan 4 iş parçacığına sahip bir uygulamam var. Ancak adım attığımda farklı iplikler arasında atlıyor. Bunu bir iş parçacığına nasıl kilitleyebilirim, böylece diğer iş parçacıkları hata ayıklama için yok sayılır?
Aynı kodla çalışan 4 iş parçacığına sahip bir uygulamam var. Ancak adım attığımda farklı iplikler arasında atlıyor. Bunu bir iş parçacığına nasıl kilitleyebilirim, böylece diğer iş parçacıkları hata ayıklama için yok sayılır?
Yanıtlar:
Evet.
Threads penceresinde (Debug -> Windows -> Threads) istediğiniz diziye sağ tıklayın ve "iş parçacığına geç" seçeneğini seçin.
Ayrıca çalışmasını engellemek için hata ayıklamak istemediğiniz iş parçacıklarında "dondur" seçeneğini de seçebilirsiniz. Ancak, işe yaramalarını bekliyorsanız, onları "çözmeyi" unutmayın.
Tek bir iş parçacığında tek bir adım atma, çoğunlukla VS 2012'de düzeltilmiş görünüyor (aşağıdaki bağlantımda görebileceğiniz bazı uyarılarla). Kırılma noktaları bir acıdır.
Önceki cevapların da belirttiği gibi, iş parçacıklarının dondurulması ve çözülmesi olağan bir çözümdür, ancak sıkıcıdır ve iş parçacığınız donmuş başka bir iş parçacığını beklediğinde takılmalara neden olabilir. İlgilendiğiniz konu başlığındaki yerinizi kaybetmeden bunları kurtarmak zor olabilir.
Diğer bir yararlı iş akışı, bazı yanıtlarda da belirtildiği gibi, kesme noktalarınıza bir iş parçacığı filtresi uygulamaktır:
Bir kesme noktası oluşturun, kesme noktasına sağ tıklayın, Filtre'ye tıklayın ve ThreadId = 7740 (iş parçacığı penceresinden iş parçacığı kimliğiniz) girin.
Bu çok sıkıcı olabilir.
Microsoft'a önerim, başka bir iş parçacığında açık bir kesme noktasına ulaşılmadığı sürece tek adımlamayı (ve bunun çeşitlerini) hiçbir zaman iş parçacığı değiştirmeyecek şekilde düzeltmektir. Filtresi olarak mevcut iş parçacığı kimliğiyle bir kesme noktası oluşturmak için bir kısayol (belki Ctrl-F9) eklemelidirler. Bu, ikinci iş akışını çok daha uygun hale getirir.
Bunun yararlı olacağını kabul ediyorsanız öneriye oy verin veya kendi önerilerinizi ekleyin:
Ayrıca kodunuza koşullu bir kesme noktası koyabilir ve thread.Id == [someValue]
veya Thread.Name == "[Somename]"
kesme noktası koşuluna koyabilirsiniz ...
Basit durumlar için çok daha hızlı bir çözüm mevcuttur - Steve'in bağlantısındaki yorumlara bakın.
hata ayıklayıcı, yalnızca adımın kaynaklandığı iş parçacığı üzerinde bir adımı tamamlayacaktır. Bu nedenle, bir kesme noktasına ulaşırsanız, onu devre dışı bırakın ve ardından adım atmaya başlayın, farklı bir iş parçacığı üzerinde durmamalısınız. Uygulamanızda başka kesme noktalarına sahipseniz ve başka bir iş parçacığı birine denk geliyorsa, açıklandığı gibi karışık iş parçacığı durumunda hata ayıklama yapacaksınız.
Bu yüzden benim durumumda, çeşitli iş parçacıkları kesme noktama ulaşmaya başladığında, aradığım aramayı tanımlayana kadar birkaç kez Devam et'e bastım - sonra kesme noktasını kaldırdım ve aynı iş parçacığı üzerinde herhangi bir girişim olmadan kalırken kodun geri kalanından geçtim onların geri kalanı.
Korumak istediğiniz birden çok kesme noktanız varsa, bu açıkça bir sorun haline gelir - ancak yine basit durumlarda bunu yapmak çok daha kolaydır.
Bu, Visual Studio 2008 SP1'de çok benzer bir soruna büyük ölçüde benzer. SP sonrası bir düzeltmeyle düzeltildi. Ancak düzeltmenin kod tabanına dahil edilmediğine dair başka kanıtlar var, bu geri bildirim öğesi de bir sorundu. Düzeltmelerin geri entegre olmaması olağandışı değildir.
Sorununuzu tam olarak tanımlayan, en azından bulabildiğim bir geri bildirim maddesi yok. Bir tane dosyalamanızı tavsiye ederim. Bunun gibi hataları yeniden üretmeyle ilgili olağan sorunlar göz önüne alındığında, sorunun nasıl yeniden üretileceğine ilişkin talimatlarla birlikte bu sorunu sergileyen bir çoğaltma projesi eklemenizi şiddetle tavsiye ederim.
Sorununuz için bir çeşit geçici çözüm var, Debug + Windows + Threads'e gidebilir, hata ayıklamak istemediğiniz konuları sağ tıklayıp Dondur'u seçebilirsiniz. Onları daha sonra çözmeyi unutmayın.
Bu hatalar, Visual Studio 2010 Service Pack 1'de yeniden düzeltildi.
Visual Studio Professional 2017 kullanıyorum ve iş parçacıklarını seçmeli olarak dondurmak ve çözmek için İş Parçacıkları penceresini kullanıyorum. Genellikle aynı kodun birden çok iş parçacığına sahibim ve yalnızca onları dondurmak istiyorum, diğerlerini değil. Aslında MS Threads penceresini seviyorum çünkü dondurulacak bir iş parçacığı alt kümesi seçebiliyorum. Konuları ada göre gruplandırıyorum ve ardından kalan iş parçacığının çalışmasına izin verirken hata ayıklarken aynı kodu çalıştıran tüm olanları dondurabilirim. Erwin Mayer uzantısını kullanmayı denedim ve çok iyi çalıştı, ancak çalıştırdığım dışındaki tüm konuları donduruyor ve bazen hata ayıklamanın olması gerektiğini düşündüğüm kesme noktasına ulaşmadığı bir duruma giriyorum, o zaman tüm diğer iş parçacıkları durdurulur ve uygulama durdurulur. Duraklat düğmesine basmak ve ileti dizileri penceresinde dizileri çözmek bu sorunu giderir.
5. Etrafta zıplamadan tek bir konuya geçin
Ne sıklıkla çok iş parçacıklı kodda hata ayıklama yapıyorsunuz, ilk kesme noktanıza ulaştığınızda, bir adım attığınızda ve sonra aniden başka bir iş parçacığındaki sarı okla durduruluyorsunuz? Beklenmeyen davranış, kesme noktasının hala ayarlanması ve sonuç olarak vurulmasından kaynaklanır. Varsayılan olarak, hata ayıklayıcı her vurulduğunda bir kesme noktasında durur. Bu, bir adım attığınızda, tüm iş parçacıklarının çalışmasına izin verildiği ve çalışan iş parçacıklarınızdan birinin, adım mevcut iş parçacığınız üzerinde tamamlanmadan önce bu kesme noktasına ulaştığı anlamına gelir. Bir dahaki sefere bu duruma girdiğinizde şunu deneyin:
- Hata ayıklayıcının geçtiği yeni iş parçacığı tarafından vurulan kesme noktasını devre dışı bırakın veya silin.
- Devam Et (F5) düğmesine basın
- Bu ilk iş parçacığındaki ilk adımınızın nasıl tamamlandığını ve şimdi etkin hata ayıklama bağlamını gözlemleyin.
- Kesme noktalarınız silindiğinden veya devre dışı bırakıldığından, kesinti olmadan o tek iş parçacığına adım atmaya devam edebilirsiniz.
Visual Studio'da hata ayıklamaya yönelik daha az bilinen 7 hack