2008-12-11 22 views
45

Bugün bir programa uzaktan hata ayıklamak için bir sorunla karşılaştım. Program başka bir sistemden başlatıldı, bu yüzden onunla komut satırında etkileşimde bulunma fırsatım yok. Kaynağını kolayca değiştirebilirdim.Uzak .NET hata ayıklayıcısı eklenene kadar bekletme

Olması gereken şey, programın normal şekilde başlamasıydı ve ardından bir hata ayıklayıcısına eklemem için beklemekti. Bunu yapmak için bir yol bulamadım, bu beni mutlu etti. Hata buldum, ama hata ayıklayıcısının yardımı olmadan.

while(true) { } 

süreç diri tuttu, sonra debugger ile "sonraki deyimi set" olabilirdi, ama garip ve kaba görünüyordu. Beni de enter tuşuna için aslında bir konsol yoktu çünkü
Console.ReadLine(); 

yazmak için tuhaf görünüyordu. (Bu işe yaramadı ya da sonraki deyimi ayarlayın ve sonra da ReadLine() beklemeye geri alır.)

Yani, ".NET/CLR/C# programına hangi kodları ekleyebilirim?" Bir hata ayıklayıcı ile iliştirene kadar bekle "

cevap

82

Bir ayıklayıcı sürecine bağlı olup olmadığını kontrol etmek System.Diagnostics.Debugger.IsAttached özelliğini kullanabilirsiniz. Bu uygulama bir hata ayıklayıcı ekli kadar bekler:

using System; 
using System.Diagnostics; 
using System.Threading; 

namespace DebugApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Waiting for debugger to attach"); 
      while (!Debugger.IsAttached) 
      { 
       Thread.Sleep(100); 
      } 
      Console.WriteLine("Debugger attached"); 
     } 
    } 
}
+1

Bu cevap için teşekkürler.Bir hata ayıklayıcı eklendiyse koddan kontrol etmenin bir yolu olması gerektiğini biliyordum ve bu aramadan elde ettiğim ilk/en iyi vuruştu. –

+0

Bir if ile birlikte bir if ve uyku ile değiştirilmesi, daha iyi bir çözüm olabilir çünkü her seferinde bir hata ayıklayıcı eklemek istemiyorsanız, kolayca devam etmenizi sağlar. – Luke

+0

'Debugger'den bir tür olay kullanmak ve 'AutoSetEvent' ile' IsAttached' olayına kadar beklemek mümkün mü? – Pixar

5

Bilmiyorum, çünkü hiç denemedim, ancak bir kesme noktasına sahip olmak için System.Diagnostics.Debugger.Break() kullanıp kullanamayacağınızı merak ediyorum ve sonra bir hata ayıklayıcının eklenmesini bekleyin. Uzak bir hata ayıklayıcının çalışacağını farz ediyorum, fakat emin değilim ve şu an için evdeki çevremden kolayca çıkıp kuramımı test edebileceğim bir yerim yok. Bir ASP.Net uygulamasında kullanmayla ilgili olarak konuşan bir MSDN article var, bu yüzden çalışacağını hayal ediyorum.

0

Hata ayıklayıcısını eklemek için size zaman tanıyan bir zamanaşımı belirleyin.

Thread.Sleep(30000); 
1
Debug.Assert(true); 

da sanırım çalışmalıdır. Bu arada, ben de zaman zaman bu problemin yüz ve ben

MessageBox.Show() 

yapın: P: P

11

Bu tam olarak neye ihtiyacınız gibi geliyor: "Başlattı ve işlemi bir hata ayıklayıcı ekler"

Debugger.Launch(); 

http://msdn.microsoft.com/en-us/library/system.diagnostics.debugger.launch.aspx

+4

Bu, uzaktan hata ayıklama yapmıyorsanız kesinlikle yanıttır. Hata ayıklamak istediğiniz kod yerel makinede olduğu sürece, bu kod satırı Visual Studio ile hata ayıklamanıza olanak veren bir açılır pencere açar. (Bu kodu bir test veya üretim kutusuna dağıtırsanız, pencere orada görünecek ve uygulamanız askıda kalıyormuş gibi görünebilir) – kbaribeau

+3

kbaribeau'yu seçmelidir: Bu yalnızca yerel bir hata ayıklayıcı eklemek istiyorsanız çalışır. OP bir uzak hata ayıklayıcı için sordu ve bu durumda, Debugger.Launch(), bir hata ayıklayıcısını – buddybubble

0

Uzak hata ayıklayıcısını eklemek, yerel hata ayıklayıcısını kullanmakla tamamen aynı şekilde çalışır.

Birincisi, her zamanki yapın:

System.Diagnostics.Debugger.Launch(); 

Bir istemi ayıklayıcısını seçti göreceksiniz. Bu noktada uygulama askıya alınır, böylece uzaktan hata ayıklayıcı ekleyebilir ve istemden "Hayır" ı seçebilirsiniz.

+1

eklemek için seçerseniz, pop-in bir uzak hata ayıklayıcı seçemezsiniz ve exe sonlandırır gibi yardımcı olmaz Uzaktan hata ayıklayıcı eklenmiş olsa bile "hayır" ı seçerek programı sonlandıracak – buddybubble

İlgili konular