2008-12-11 37 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(); 

你会看到一个提示选择调试器。此时执行已暂停,因此您可以附加远程调试器并从提示中选择“否”。