Как ждать, пока подключен удаленный отладчик .NET

Сегодня я столкнулся с проблемой, где мне нужно было удаленно отлаживать программу. Программа была запущена из другой системы, поэтому у меня действительно нет возможности взаимодействовать с ней в командной строке. Я мог бы легко изменить его источник.

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

while(true) { }

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

Console.ReadLine();

Мне показалось странным печатать, потому что на самом деле для меня не было консоли, чтобы нажать Enter . (Это тоже не сработало. Установите следующий оператор, а затем выполните, вы вернетесь в ожидание ReadLine ().)

Итак, какой код я могу вставить в программу .NET / CLR / C #, которая говорит: «Подождите, пока я не смогу подключиться с помощью отладчика»?

11.12.2008 21:42:19
6 ОТВЕТОВ
РЕШЕНИЕ

Вы можете использовать свойство 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");
        }
    }
}
116
16.02.2009 09:49:40
Спасибо за этот ответ. Я знал, что должен быть способ проверить из кода, был ли подключен отладчик, и это был первый / лучший хит, который я получил от поиска.
David Hay 30.09.2009 21:28:25
Замена while на if и sleep на assert может быть лучшим решением, потому что это позволит вам легко продолжить, если вы не хотите каждый раз подключать отладчик.
Luke Kim 13.08.2011 15:30:39
Можно ли использовать какое-то событие от Debuggerи ждать какого-то события, AutoResetEventпока IsAttachedсобытие не будет инициировано?
Pixar 27.08.2015 11:59:15

Я не знаю, так как никогда не пробовал, но мне интересно, можно ли использовать его System.Diagnostics.Debugger.Break(), чтобы он достиг точки останова, а затем дождаться присоединения отладчика. Я предполагаю, что удаленный отладчик будет работать, но я точно не знаю, и в настоящее время у меня нет доступа к моей домашней среде, где я мог бы легко смоделировать его и проверить свою теорию. Есть статья в MSDN, в которой говорится об использовании ее в приложении ASP.Net, поэтому я думаю, что она будет работать.

6
22.09.2011 13:23:27

Установите время ожидания, которое дает вам время для подключения отладчика.

Thread.Sleep(30000);
0
22.09.2011 13:23:09
Debug.Assert(true);

Должен также работать, я думаю. Кстати, я тоже с этой проблемой порой сталкиваюсь и делаю

MessageBox.Show() 

: P: P

1
16.02.2009 09:34:53
Хахаха, мне нравится этот ответ, но спасибо за такой грязный обходной путь - MessageBox будет блокировать выполнение до тех пор, пока не произойдет взаимодействие с пользователем xD
John Antony Daniel Nolan 11.10.2018 12:46:17

Это звучит как то, что вам нужно:

Debugger.Launch();

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

«Запускает и присоединяет отладчик к процессу».

21
14.09.2010 17:45:52
Это абсолютно тот ответ, который вам нужен, если вы не выполняете удаленную отладку. Пока код, который вы хотите отладить, находится на локальном компьютере, эта строка кода откроет всплывающее окно, которое позволит вам отладить его с помощью Visual Studio. (Если вы развернете этот код в тестовом или производственном окне, там появится окно, и ваше приложение может зависнуть)
kbaribeau 4.10.2010 19:50:25
должен второй kbaribeau: это работает, только если вы хотите подключить локальный отладчик. OP запросил удаленный отладчик, и в этом случае Debugger.Launch () не поможет, так как вы не можете выбрать удаленный отладчик во всплывающем окне, и он будет завершать исполняемый файл, если вы решите не подключать отладчик
buddybubble 15.11.2013 11:52:42
Не работает для удаленной отладки. Вызвал мой VS и программу для сбоя.
user3772108 21.08.2019 07:29:09

Присоединение удаленного отладчика работает точно так же, как и использование локального отладчика.

Сначала сделаем обычное:

System.Diagnostics.Debugger.Launch();

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

2
14.01.2013 11:57:37
Я проверил это, и выбор «нет» завершит программу, даже если удаленный отладчик уже подключен
buddybubble 15.11.2013 11:53:42