2008-12-11 38 views
45

今天我遇到了一個問題,我需要遠程調試一個程序。該程序是從另一個系統啓動的,所以我實在沒有機會在命令行上與它進行交互。雖然我可以很容易地改變它的來源。如何等待,直到連接遠程.NET調試器

我需要發生的是程序正常啓動,然後等待我用調試器附加到它。我無法想出辦法讓我開心。我確實發現了這個錯誤,但沒有調試器的幫助。

while(true) { } 

不停過程活着,然後我可以「設置下一條語句」使用調試器,但它似乎尷尬和粗魯。

Console.ReadLine(); 

看起來很怪異類型,因爲那裏本來就不是一個控制檯我按在進入。 (它也沒有工作,設置下一個語句,然後運行將帶您回到ReadLine()等待)。

那麼,我可以在.NET/CLR/C#程序中插入什麼樣的代碼,在這裏等待,直到我可以附加一個調試器「?

回答

82

可以使用System.Diagnostics.Debugger.IsAttached屬性來檢查,如果一個調試器附加到進程。此應用程序將等到調試器已附加:

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

感謝您的回答。我知道必須有一種方法來檢查代碼是否附加了調試器,這是我從搜索中獲得的第一個/最好的命中。 – 2009-09-30 21:28:25

+0

使用if替換while以及使用assert替換睡眠可能是更好的解決方案,因爲如果您不想每次都附加調試器,它將允許您輕鬆地繼續。 – Luke 2011-08-13 15:30:39

+0

是否可以使用`Debugger`中的某種事件並等待某個`AutoResetEvent`直到引發IsAttached事件? – Pixar 2015-08-27 11:59:15

5

我不知道,因爲我從來沒有嘗試過,但我不知道你是否可以使用System.Diagnostics.Debugger.Break()爲了讓它達到一個斷點,然後等待調試器連接。我假設一個遠程調試器可以工作,但我不確定,目前無法訪問我的家庭環境,我可以輕鬆地嘲笑它並測試我的理論。有一個MSDN article談論在ASP.Net應用程序中使用它,所以我想它會起作用。

0

設置一個超時,讓您有時間附加調試器。

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

也應該工作,我猜。順便說一句,我也面臨這個proble有時,我做

MessageBox.Show() 

:P:P

0

連接遠程調試器的工作方式與使用本地調試器完全相同。

首先,做平常:

System.Diagnostics.Debugger.Launch(); 

你會看到一個提示選擇調試器。此時執行已暫停,因此您可以附加遠程調試器並從提示中選擇「否」。