2008-12-11 3 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

Замена while с помощью if и sleep с помощью 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(); 

Вы увидите приглашение выбрать отладчик. На этом этапе выполнение приостанавливается, поэтому вы можете подключить удаленный отладчик и выбрать «Нет» из приглашения.