Подтвердить что ты не робот

Может ли исходный код .NET жестко кодировать точку останова отладки?

Я ищу способ в .NET(2.0, С# в частности) для исходного кода запускать отладочный разрыв, как если бы точка останова была установлена ​​в этот момент, не задумываясь о том, чтобы установить конкретную точку останова в отладчик и не вмешиваясь во время выполнения.

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

Моя попытка использовать Debug.Assert(false) была меньше идеальной, и я предполагаю, что Debug.Fail() будет вести себя одинаково. Теоретически это не должно иметь никакого эффекта в производстве, и оно успешно останавливается при отладке, но по дизайну (насколько я могу судить) нет возможности продолжить выполнение, если вы хотите игнорировать эту ошибку, как вы могли бы с фактической точкой останова, и, как и в производстве, мы проглотим ошибку. Это также, по-видимому, нарушает оценку состояния переменной, потому что отладчик фактически останавливается в собственном системном коде, а не в нашем, поэтому его отладочная помощь ограничена. (Возможно, мне не хватает какого-то способа вернуться к вещам, чтобы посмотреть на переменные и т.д., Где это произошло.)

Я надеялся на что-то вроде Debug.Break(), но он, похоже, не существует (если, возможно, в более поздней версии .NET?), и никакие другие методы Debug также не применимы.

Обновление:. В то время как ответ ctacke является лучшим совпадением для того, что я искал, с тех пор я обнаружил трюк с Debug.Assert() - при запуске в отладчике - Пауза отладчик, перейдите к коду для ожидания отладки Debug.Assert(выделено зеленым цветом, потому что он отсутствует в коде фреймворка) и нажмите "Вычеркнуть" (shift-F11), а затем нажмите "Игнорировать" в диалоговом окне "Утверждение". Это приведет к тому, что отладчик остановится на возврате assert (и сможет продолжить выполнение, как если бы оно не произошло, поскольку оно было проигнорировано). Могут быть другие способы сделать то же самое (ударяет ли Retry это более прямо?), Но этот способ был интуитивным.

4b9b3361

Ответ 1

Вы, вероятно, после чего-то вроде этого:

if(System.Diagnostics.Debugger.IsAttached)
  System.Diagnostics.Debugger.Break();

Конечно, это все равно будет скомпилировано в сборке Release. Если вы хотите, чтобы он больше походил на объект Debug, где код просто не существует в сборке Release, вы можете сделать что-то вроде этого:

    // Conditional("Debug") means that calls to DebugBreak will only be
    // compiled when Debug is defined. DebugBreak will still be compiled
    // even in release mode, but the #if eliminates the code within it.
    // DebuggerHidden is so that, when the break happens, the call stack
    // is at the caller rather than inside of DebugBreak.
    [DebuggerHidden]
    [Conditional("DEBUG")] 
    void DebugBreak()
    {
        if(System.Diagnostics.Debugger.IsAttached)
            System.Diagnostics.Debugger.Break();
    }

Затем добавьте его в свой код.

Ответ 2

System.Diagnostics.Debugger.Break?

Ответ 3

Я столкнулся с ситуацией, когда это не сработало

System.Diagnostics.Debugger.Break();

но это сделало

System.Diagnostics.Debugger.Launch();

Ответ 4

Если вы хотите иметь только одну строку кода вместо 4, оберните

#if DEBUG
       if (Debugger.IsAttached)
            Debugger.Break();
#endif

в

public static class DebugHelper
{
    [DebuggerHidden]
    [Conditional("DEBUG")]
    public static void Stop()
    {
       if (Debugger.IsAttached)
            Debugger.Break();
    }
}

и используйте

DebugHelper.Stop();

Добавлен параметр DebuggerHiddenAttribute, чтобы предотвратить отладчик от остановки внутреннего кода метода Stop и от входа в метод с помощью F11.

Ответ 5

Как просто настроить Visual Studio на всплывающее окно с отладчиком, даже если вы его проглотите?

Сделайте это:

  • Перейдите в Debug- > Exceptions...
  • Найдите правильное исключение или добавьте его, если это ваш собственный
  • Установите флажок "Брошенный" для исключения

Это остановит Visual Studio в том месте, где выбрано исключение, а не только при его отсутствии.

Вы можете увидеть дополнительную информацию здесь.

Ответ 6

Хороший трюк, который я нашел, это положить Debugger.Break() в ctor вашего Exception.

Ответ 7

В Visual Studio 2010 нажатие Повторить в диалоговом окне Debug.Assert приведет к неудачному утверждению отладки, точно так же, как если бы у вас была точка останова.