Visual Studio'da tek bir iş parçacığında hata ayıklama nasıl?


254

Bazı projelerle bir çözümüm var. Farklı projelerde birkaç kırılma noktası vardır. Bu iş parçacığı ilk hit iş parçacığı izlemek ve aynı kod blokları giren diğer iş parçacıkları rağmen bu tek iş parçacığının izlemeye devam etmek istiyorum.

Bu kesme noktasında, yani iş parçacığı adı = ... veya iş parçacığı Id = ... bir durum tanımlayarak mümkün olduğunu biliyorum ama benim durumum ağır yüklü bir ASP.NET uygulaması ve en kısa sürede w3wp.exeçok eklemek evreleri kırılma noktalarına ulaşacaktır. Gibi bir şeye ihtiyacım var ThreadLocal<break-point>.

Mümkün mü? Öyleyse nasıl?


7
@Paolo: Bu web uygulaması büyük bir web çiftliğinin kalbi olarak çalışır ve buggy durumunu test senaryolarında taklit etmek imkansızdır.
Xaqron

VS 2019 için belki de şunu denemelisiniz: stackoverflow.com/a/61868591/8579563
Gozo

Yanıtlar:


151

Diğer iş parçacıkları kod çalıştırmadığından, iş parçacıklarını Dondurma / Çözme yanlış bir yöntemdir.

En doğru ve kullanışlı yol:

  1. Kesme noktaları penceresinde Ctrl + A tuşlarına basın (tüm kesme noktalarını seçin).
  2. Sağ tıklayın ve "Filtre ..." yi seçin.
  3. "ThreadId = (geçerli iş parçacığı kimliği)" girin.

Gelen Visual Studio 2015 ve daha yeni, süreç benzer:

  1. Kesme noktaları penceresinde Ctrl + A tuşlarına basın (tüm kesme noktalarını seçin).
  2. Sağ tıklayın ve "Ayarlar ..." ı seçin.
  3. "Koşullar" ı işaretleyin ve açılır menüden "Filtre" yi seçin
  4. "ThreadId = (geçerli iş parçacığı kimliği)" girin.

Böylece tüm evreler yürütülür, ancak hata ayıklayıcı yalnızca geçerli evreye çarpar.


51
Bu, "Adım" hata ayıklayıcı komutunun diğer iş parçacıklarını girmesini engelliyor mu? Bu büyük bir problemdi. Benim iş parçacığım üzerinden adım ve kodun tamamen ilgisiz bir bölümünde aniden. Artık Visual Studio'da geliştirilmiyorum, bu yüzden test edemiyorum.
Matt Faus

8
Kesme noktaları penceresine sağ tıkladığınızda "filtre" komutu yoktur ... ve yine de geçerli iş parçacığı kimliğini nasıl bulabilirsin? - Hemen pencereye gidip yazarak System.Threading.Thread.CurrentThread.ManagedThreadIdfalan mısın?
BrainSlugs83

5
VS'mde (2015, Topluluk Sürümü), birden çok kesme noktasının Ayarlarını aynı anda değiştirmek mümkün değildir. Böylece Filtre sadece birer birer ayarlanabilir.
robert4

5
Bu problemi sonsuza kadar yaşadım ve son işime yemin edebilirim, görsel stüdyosunun, çalıştığınız konuya yapışacağınız tutulma gibi çalışmasını sağlayan bir ayar buldum, ancak bu veya herhangi bir referans bulamıyorum ona. Hayal ettiğimi merak etmeye başladım.
stu

7
-1 çünkü bu yalnızca kesme noktalarına izin verir, ancak gerçekten hata ayıklamaya izin vermez: adım at / adım at, tek bir iş parçacığında hata ayıklamak için bu şekilde çalışmaz.
Serge Rogatch

338

İşte yaptım:

  1. Yalnızca aradığım konuya vuracağımı bildiğim koşullu bir kırılma noktası ayarlayın.

  2. Kesme noktası isabet edip istediğiniz iş parçacığına girdikten sonra, Visual Studio Konuları penceresinde (hata ayıklama sırasında Hata Ayıkla -> Windows -> İş Parçacıkları), Ctrl+ A(tüm iş parçacıklarını seçmek için) ve ardından Ctrlşu anda bulunduğunuz iş parçacığını + tıklatın . Hata ayıklamak istediğiniz konu dışındaki tüm evreler seçilmelidir.

  3. Sağ tıklayın ve "Dondur" u seçin.

Şimdi, Visual Studio yalnızca çözülmüş iş parçacığında adım atacaktır. Bunu yaparken çok daha yavaş görünüyor, çünkü muhtemelen tüm donmuş ipliklerin içinden geçmesi gerekiyor, ancak çok iş parçacıklı hata ayıklamaya biraz akıl sağladı.


1
Farklı iş parçacıklarında çalışan yaklaşık 8 görevim olan bir bağlamda bu benim için çalışmıyor. Ben diğer tüm iş parçacıkları ve "adım" dondurmak ama IDE bir süre donuyor, sonra yine de başka bir iş parçacığına atlar.
Meta-Knight

3
@Diego: Ben proje üzerinde artık çalışmıyorum ama biri dışında tüm iş parçacıklarını dondurmak olacaksa, iş parçacığı buggy tamamlayıcı olduğu için hataya neden olan senaryo değişecektir. Bu zarif bir çözüm olmasına rağmen, bu özelliğin VS içine yerleştirilmesi gerektiği anlaşılıyor.
Xaqron

3
@ Meta-Knight Ana Konu dışındaki tüm konuları dondurmalısınız . Bu IDE gibi yapacaksanız donmayacak
Alex Zhukovskiy

15

Az önce tam olarak aradığınızı yapan bir Visual Studio 2010+ uzantısı yayınladım. Ve ücretsiz :).

Sunum

Bu Visual Studio uzantısı, geliştiricilerin çok iş parçacıklı uygulamalarda hata ayıklarken kolayca tek bir iş parçacığına odaklanmalarını sağlamak için iki kısayol ve araç çubuğu düğmesi ekler.

Tüm iş parçacıklarını, ancak izlenmesi gereken iş parçacıklarını dondurmak / çözdürmek için manuel olarak Dişler penceresine gitme ihtiyacını önemli ölçüde azaltır ve bu nedenle üretkenliği artırmaya yardımcı olur.

Özellikleri

Daha fazla yürütmeyi yalnızca geçerli iş parçacığıyla sınırla. Diğer tüm iplikleri dondurur. Kısayol: CTRL + T + T veya Kar Tanesi düğmesi. Sonraki tek iş parçacığına geçin (kimliğe göre). Geçerli iş parçacığını değiştirir ve diğer tüm iş parçacıklarını dondurur. Kısayol: CTRL + T + J veya İleri düğmesi.

Check it out burada Galerisi'nde üzerine, resmi sayfaya veya Github depo .


Hangi VS sürümünü kullanıyorsunuz?
Erwin Mayer

Uzantıyı yükledim, ancak çalışmasını başaramadım (mevcut projem için VS2010 kullanıyorum). [İş parçacıkları etkin hale geldiğinde iş parçacıklarının aktif hale gelmesiyle ilgili bir sorun olduğunu düşündüğümde, muhtemelen standart davranıştır, bu yüzden önceki yorumumu kaldırdım].
çalışması devam ediyor

3
Bunu kontrol edeceğim. Gezegendeki Microsoft'un en büyük hata ayıklama hatalarından birini çözmek için herhangi bir girişimde bulunan tek kişi siz olabilirsiniz.
stu

ne yazık ki, vs2012 üzerine yüklenmez. Daha yeni bir sürümünüz var mı yoksa kaynak kodu kendim oluşturabilmem için paylaşacak mısınız?
stu

@stu Kaynak kodu burada Codeplex üzerinde: singlethread.codeplex.com VS 2012 ve VS 2013 üzerinde çalışması gerekir ama ben güncellemedim (kimse talep ve ben kendime ihtiyacım yoktu). VS 2012+ ile kolayca çalışmasını sağlayabilir ve Codeplex üzerinde bir taahhütte bulunabiliyorsanız, Galeri'ye de itebilirim.
Erwin Mayer

13

Bir web uygulamasında olduğu gibi birden çok iş parçacığı oluşuyorsa @MattFaus yanıtlayıcısı çalışmaz. onun yerine ne yaptım

  • İstediğim işlevin iş parçacığını kesmek için bir kesme noktası ayarlayın.
  • İş parçacığı kesme noktasına ulaşıp duraklatıldığında, kesme noktasını kaldırırım ve diğer iş parçacıklarının çalışabilmesi için F8, F10 ve F11 kullanarak hata ayıklamaya devam ediyorum.

En iyi cevapları okuduktan sonra, bu geçici çözüm benim için çalıştı.
Swanand Pangam

9

Bir hafifçe ben kullandım farklı yaklaşım:

  1. Normal bir kesme noktası oluşturun ve vurulmasına izin verin
  2. Geçerli hata ayıkladığınız yönetilen iş parçacığı kimliğini iş parçacığı pencerenizde arayın
  3. Kesme noktaları penceresinde ve seçici filtresinde kesme noktanızı sağ tıklayın
  4. ThreadId = xxx girin; burada xxx, 2 numaralı konu kimliğidir
  5. Artık diğer konuları durdurmadan ve kesme noktanıza çarpmadan hata ayıklayabilirsiniz

Bu, ikinci bir iş parçacığı kesme noktanıza gelmeden önce yukarıdaki işlemleri yapmak için zamanınız olduğunu varsayar. Değilse ve diğer iş parçacıkları yukarıdaki işlemi yapmadan önce kesme noktanıza çarparsa, iş parçacığı penceresinde sağ tıklayıp dondurmayı seçebilirsiniz.


3
+1. "Bu, ikinci bir iş parçacığının kesme noktanıza gelmeden önce ... zamanınız olduğunu varsayar". Bir noktalı virgül bir kilide sarar ve noktalı virgül üzerine bir kesme noktası koyarım. Kesme noktası ilk kez vurulduğunda, kesme noktasını devre dışı bırakırım. Kilit nedeniyle başka dişler gelemez. lock(m_someObject) { ; }
bluedog

Size bir Google kaydetmek için, iş parçacıkları penceresi Hata Ayıkla> Windows> Konular altında bulunur.
Gabe

2

VS 2019'da:

  1. Bir yere kesme noktası koyun.
  2. İş parçacığınız gelene kadar F5'e (Devam) basın.
  3. Kaldırmak için kesme noktasını tıklayın.
  4. İpliği F10 veya F11 ile adımlayabilirsiniz.

VS2015 için de çalışıyor!
tarih öncesi

1

Aynı donanım veya yeni bir makinede (küme) canlı sunucuda uygulamanın başka bir örneğini eklemenizi ve daha sonra yalnızca bu örnekte hata ayıklamayı öneririm. Kullanıcıların tetiklediği kodda bir kesme noktası eklemek olmaz. Bu bir seçenek değilse, daha fazla izleme eklerdim.

Ancak, bu kesinlikle gerekliyse ve bir çözüm statüsüne ihtiyacınız varsa, eminim sadece istek IP adresinizden geliyorsa kırılan bir kesme noktası ekleyebilirsiniz. Bunu, denetleyen koşullu bir kesme noktası ekleyerek yaparsınız HttpContext.Request.UserHostAddress. Ancak bunun uygulamanızı önemli ölçüde yavaşlattığını unutmayın.


Ben de bunu denedim. Sorun, bu örneğin aynı etki alanında (IP veya başka bir etki alanında çalışıyor) çalışmıyor olması ve birçok sertifika sorununa (SSL, WCF, ...) yol açması ve düşük yük altında buggy durumu asla gerçekleşmez!
Xaqron

Üzgünüm, bunlardan hangisini denediğinizden emin değilim, koşullu kesme noktasını denediniz mi?
steinar

Evet, benzersizliği sağlamak için onları yönetilen kimliklerine göre adlandırdım. Sonra hangi kimliğin atandığını tahmin etmek ve durumu bir tahmine dayanarak ayarlamak zordur. Bazen tahmin yakındır ve bazen ipliği yakalamak uzun zaman alır.
Xaqron

1

Diğer tüm iş parçacıklarını durdurmak istemiyorsanız (belki de istekleri yanıtlaması gereken çalışan bir uygulamaya Visual Studio hata ayıklayıcısı ekliyorsunuz), kesme noktalarını otomatik olarak oluşturan ve kaldıran bir makro kullanabilirsiniz.

Bu, Visual Studio'da çok iş parçacıklı programlarda hata ayıklarken Yığın Taşması sorusunun "Adım at" sorusuna yanıt olarak önerilir .

Ancak, bağlantı yalnızca satır satır nasıl hata ayıklanacağını açıklar. Yalnızca geçerli iş parçacığında durdurmak için tüm kesme noktalarını (örneğin belirli bir satır aralığında) değiştirmesini sağlamak için makroyu değiştirmenizi öneririm.


1

Sanırım bu Visual Studio 2015'te biraz farklı. Kesme noktalarındaki birkaç şeyi değiştirdiler, ancak kabul edilen cevabı hzdbyte'den (yukarıdaki) nasıl uygulayacağınız aşağıda açıklanmıştır:

Kodlama marjındaki kesme noktasında, Sağ Tık> Koşullar> 'Koşullu İfade' den 'Filtre' ye tıklayın. Bu daha sonra ThreadId'e göre filtrelemenizi sağlar.

Alternatif olarak Kesme Noktaları penceresindeki kesme noktasında, Sağ Tık> Ayarlar> Koşullar kutusunu işaretleyin ve yukarıdakileri yapın.


1

Çizginin yan çubuğuna sağ tıklayarak bir Kesme Noktası Koşulu ayarlayın. "Koşul" u seçin ve iş parçacığınızın adını tırnak işareti ile aşağıdakileri girin:

System.Threading.Thread.CurrentThread.Name == "name_of_your_thread"

Alternatif olarak, iş parçacığının "İş Parçacıkları" Penceresinden "Yönetilen Kimlik" i alıp şunları yapabilirsiniz:

System.Threading.Thread.CurrentThread.ManagedThreadId == your_managed_thread_id

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.