2011-11-18 17 views
25

Hata ayıklama sırasında yalnızca bir iş parçacığının yürütülmesini takip etmek istiyorum. Hata ayıklayıcısını iş parçacığı arasında değişmeye devam etmesi için bir threadpool kullanıyorum ve bu hata ayıklamayı çok rahatsız ediyor.Visual Studio'da yalnızca bir iş parçacığında hata ayıklama

Okuma:

I (diş adına göre) koşullu kesme noktaları olan bir çözüm elde. Bununla birlikte, "# 3 numaralı iş parçacığı" nı her zaman ilginç davayı ele alan biri olamayacağını söyleyemem, bu yüzden her bir yürütme için koşulu değiştirmek zorundayım. Çok fazla iş.

Başka bir çözüm, yalnızca ilginç iş parçacığı çalıştırmak için donma/çözme özelliğini kullanmaktır. Bununla birlikte, bu, tüm iş parçacıklarının duraklatıldığı için bazı bilgileri kullanılamaz hale getirir.

Şu an kullandığım şey, iyi bir iş parçacığının içinde olacağından emin olduğum bir kesme noktasına ulaşana kadar programın çalıştırılmasını sağlamaktır. Daha sonra tüm thread thread'ları duraklatırım ve yürütmeyi sürdürmeye çalışıyorum. Eğer programlar sıkışmış gibi görünüyorsa, mevcut parçayı duraklatıyorum ve çözüyorum.

En uygun çözüm, doğru iş parçacığını bulup işaretleyin ve sonra Visual Studio'ya: "yalnızca geçerli iş parçacığı işaretlendiğinde kesilir".

Bu mümkün mü?

+0

Peki iş parçacığı için kırılma ölçütleri nedir? – abatishchev

+0

ölçüt duracak iş parçacığı işaretli – kamaradclimber

+0

Kodunuzu bağımsız olarak sınayın. Örneğin birim testleri ile. Daha sonra sadece thread etkileşimini hata ayıklamak zorundasınız, iş parçacıklarını dondurmak istediğiniz * hata ayıklama türüdür. –

cevap

2

Bahsettiğiniz koşullu kesme noktalarını kullanacağım, ancak bazı sabit değişkenlerle karşılaştırmak yerine, bazı yarı küresel değişkenlerle (belki de ana sınıfınızdaki statik bir özellik) karşılaştıralım.

Hangi iş parçacığının ilginç olduğunu belirlediğinizde, değişken adını ayarlamak ve koşullu kesme noktalarınızın vurulmasına izin vermek için anında pencereyi kullanabilirsiniz.

+0

olası bir çözüm. Ancak 2 geri dönüşümü görüyorum: Kodumun hata ayıklamasını değiştirmem gerekiyor ve bir (karmaşık) kesme noktası prosedüründen geçmem gerekiyor (1 tıklama vs tıklama, kopya geçmiş, 1 tıklama) – kamaradclimber

+0

Son zamanlarda ayarlayanlar için (benim gibi) I Bunu okumak için [bu geçici çözümü detaylandıran cevabı] (http://stackoverflow.com/a/38926833/1348138) biraz daha okumayı önerin. Ayrıca [burada belirtilen öneri] oy vermenizi tavsiye ederim (http://stackoverflow.com/a/31191208/1348138). – robert4

6

Eğer konu penceredeki tüm konuları dondurmak ve ilgilendiğiniz tek sürdürmek.

+3

teşekkürler ama bu soruya cevap vermiyor: Uygulamanın normal çalışmasını istiyorum ve sadece bir iş parçacığı – kamaradclimber

1

Biraz geç olabilir ayıklama ama bu bir aramada ilk yanıt olarak kadar kırpılmış iken.

VS 2015 yılında aşağıdaki kullanmak

... kesme noktası Sonra

var thread = System.Threading.Thread.CurrentThread; 
if (thread.Name == null) 
      thread.Name = "Main"; 

...

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

daha esnek bir özel sınıfta Konu gömebilirsiniz yapmak.

FYI: Statik değişkenler, koşullu olmadıklarından dolayı koşullu kesme noktasında kullanamazsınız. Asla statiğin neden her zaman bağlam içinde olmadığını anlamıştım.

+0

'daki break noktalarında durmak istiyorum Cevabınız için teşekkürler (hatta geç) iş parçacığının adını vermek için ilk kod parçasını nereye eklersiniz? (Bu kodu eklemek istedim önce takip etmek istediğim iş parçacığı bilmek gerekir) – kamaradclimber

+0

@kamaradclimber. En kısa sürede. Bir iş parçacığı adını yalnızca bir kez veya istisna olarak ayarlayabilirsiniz. Thread.Name öğesini debug'da elle ayarlayabilirsiniz. Ayrıca, thread.name == xxx System.Diagnostics.Debugger.Break() – Paulustrious

+0

Üzgünüz .. 5 dakikalık zaman aşımı olup olmadığını da söyleyebilirsiniz. @kamaradclimber. En kısa sürede. Bir iş parçacığı adını yalnızca bir kez veya istisna olarak ayarlayabilirsiniz. Thread.Name hata ayıklamasında elle veya yalnızca System.Threading.Thread.CurrentThread.Name = "xyz" olarak ayarlayabilirsiniz. Ayrıca şunu da söyleyebilirsiniz: if (thread.name == xxx) {System.Diagnostics.Debugger.Break();}. İsterseniz birden fazla iş parçacığına aynı adı verebilirsiniz. Geçmişte bool stop = thread.Name == "someName" satırları boyunca kod ekledim ve hata ayıklama noktasında 'stop' koşulunu koyabilirsiniz. Hayatı kolaylaştırır – Paulustrious

İlgili konular