2008-12-11 26 views
45

Hôm nay tôi gặp phải sự cố là tôi cần phải gỡ lỗi từ xa một chương trình. Chương trình đã được khởi chạy từ một hệ thống khác, vì vậy tôi thực sự không có cơ hội tương tác với nó trên dòng lệnh. Tôi có thể thay đổi nguồn của nó một cách dễ dàng mặc dù.Cách đợi cho đến khi trình gỡ lỗi .NET từ xa đính kèm

Điều tôi cần xảy ra là chương trình bắt đầu bình thường và sau đó đợi tôi đính kèm với chương trình gỡ rối. Tôi không thể nghĩ ra cách để làm điều đó khiến tôi hạnh phúc. Tôi đã tìm thấy lỗi, nhưng không có sự trợ giúp của trình gỡ rối.

while(true) { } 

Giữ quá trình còn hoạt động, sau đó tôi có thể "đặt câu lệnh tiếp theo" bằng trình gỡ lỗi, nhưng có vẻ khó xử và thô lỗ.

Console.ReadLine(); 

Có vẻ lẻ để gõ vì không không thực sự là một Console cho tôi để nhấn nhập tại. (Nó không hoạt động, hoặc là. Đặt câu tiếp theo và sau đó chạy sẽ đưa bạn trở lại ReadLine() chờ đợi.)

Vì vậy, loại mã nào tôi có thể chèn vào chương trình .NET/CLR/C# có nội dung " chờ ở đây cho đến khi tôi có thể đính kèm với một trình gỡ lỗi "?

Trả lời

82

Bạn có thể sử dụng System.Diagnostics.Debugger.IsAttached tài sản để kiểm tra xem một debugger được gắn vào quá trình này. Ứng dụng này sẽ đợi cho đến khi một debugger đã được đính kèm:

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

Cảm ơn câu trả lời này.Tôi biết đã có một cách để kiểm tra từ mã nếu một trình gỡ lỗi được đính kèm, và đây là lần đầu tiên/tốt nhất tôi nhận được từ tìm kiếm. –

+0

Thay thế thời gian bằng một if và giấc ngủ với một khẳng định có thể là một giải pháp tốt hơn, bởi vì nó sẽ cho phép bạn tiếp tục một cách dễ dàng nếu bạn không muốn đính kèm một trình sửa lỗi mỗi lần. – Luke

+0

Có thể sử dụng một số loại sự kiện từ 'Debugger' và chờ một số' AutoResetEvent' cho đến khi sự kiện 'IsAttached' được nâng lên không? – Pixar

5

Tôi không biết, vì tôi chưa bao giờ thử nó nhưng tôi tự hỏi liệu bạn có thể sử dụng System.Diagnostics.Debugger.Break() để nó đạt đến điểm ngắt và sau đó đợi trình gỡ rối đính kèm. Tôi giả định một trình gỡ lỗi từ xa sẽ hoạt động, nhưng tôi không biết chắc chắn và hiện không có quyền truy cập vào môi trường gia đình của tôi, nơi tôi có thể dễ dàng giả lập và kiểm tra lý thuyết của tôi. Có một số MSDN article nói về việc sử dụng nó trong một ứng dụng ASP.Net vì vậy tôi tưởng tượng nó sẽ hoạt động.

0

Đặt thời gian chờ cung cấp cho bạn thời gian để đính kèm trình gỡ lỗi.

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

cũng nên làm việc tôi đoán. Bằng cách này, tôi cũng phải đối mặt với proble này vào những thời điểm và tôi làm

MessageBox.Show() 

: P: P

11

này nghe có vẻ như chính xác những gì bạn cần:

Debugger.Launch(); 

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

"ra mắt và gắn một debugger để quá trình này."

+4

Đây hoàn toàn là câu trả lời bạn muốn nếu bạn không thực hiện gỡ lỗi từ xa. Vì vậy, miễn là mã bạn muốn gỡ lỗi là trên máy địa phương, dòng mã này sẽ mở một cửa sổ bật lên cho phép bạn gỡ lỗi nó bằng Visual Studio. (Nếu bạn triển khai mã này vào hộp kiểm hoặc hộp sản xuất, cửa sổ sẽ xuất hiện ở đó và ứng dụng của bạn có thể bị treo) – kbaribeau

+3

phải bảo mật kbaribeau: Tùy chọn này chỉ hoạt động nếu bạn muốn đính kèm trình gỡ lỗi cục bộ. OP yêu cầu một trình gỡ lỗi từ xa và trong trường hợp này, Debugger.Launch() sẽ không giúp bạn khi bạn không thể chọn trình gỡ rối từ xa trong cửa sổ bật lên và vì nó sẽ chấm dứt exe nếu bạn chọn không đính kèm trình gỡ lỗi – buddybubble

0

Gắn trình gỡ lỗi từ xa hoạt động chính xác giống như sử dụng trình gỡ lỗi cục bộ.

Đầu tiên, hãy làm như thường lệ:

System.Diagnostics.Debugger.Launch(); 

Bạn sẽ thấy một dấu nhắc để chọn gỡ lỗi. Tại thời điểm này, việc thực hiện bị treo, vì vậy bạn có thể đính kèm trình gỡ lỗi từ xa và chọn "Không" từ lời nhắc.

+1

Tôi đã thử nghiệm và chọn "no" sẽ chấm dứt chương trình ngay cả khi trình gỡ lỗi từ xa đã được đính kèm – buddybubble

Các vấn đề liên quan