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

Устранение отладки VS2010 при сбое Debug.Assert

Есть ли способ вызвать разрыв Visual Studio 2010 во время отладки, когда аргумент Debug.Assert оценивается как false?

Пример: в моем коде у меня есть строки вроде этого:

Debug.Assert(!double.IsInfinity(x));

Если я не отлаживаю, появляется окно, когда утверждение не выполняется.

Но когда я отлаживаю, утверждение записывается на панель "Выход", что легко пропустить; нет всплывающего окна, и отладчик не останавливается. Поэтому: есть ли способ заставить отладчик Visual Studio прерываться, если Debug.Assert не работает?

(BTW: Я разрабатываю настольное приложение на основе WPF. В приложении Windows Forms поведение, похоже, отличается: здесь отладчик останавливается на Debug.Assert.)

РЕДАКТИРОВАТЬ. Пожалуйста, дайте мне понять: я не ищет альтернативу Debug.Assert(), потому что мой код и внешний код, который я использую, полны Debug.Assert(). Я ищу способ заставить отладчик Visual Studio прерываться, когда Debugg.Assert терпит неудачу. (Я думаю, что ранее версии VS сделали это, и что поведение изменилось в VS2010).

4b9b3361

Ответ 2

Вы можете использовать контрольную точку состояния для такого поведения, просто установите точку останова в строке, на которой вы хотите сломать, а затем щелкните правой кнопкой мыши на точке слева и выберите условие, во всплывающем окне введите желаемое условие (в вашем случае является double.IsInfinity(x))

Ответ 3

Используйте метод Debugger.Break (в пространстве имен System.Diagnostics). Это нарушит выполнение, если вы работаете в отладчике.

Ответ 4

Кажется, что работа в ожидании для меня в консольном приложении по крайней мере: в отладочных сборках появляется всплывающее диалоговое окно, которое позволяет вам входить в приложение с помощью отладчика, но в сборках релизов ничего не происходит. По общему признанию, я просто использовал упрощенную Debug.Assert(false);, но я не понимаю, почему это должно иметь большое значение. Я запускаю Visual Studio 2010 SP1 Ultimate.

Я бы посоветовал вам внимательно ознакомиться с настройками сборки.

Вот код, который я использовал:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Diagnostics.Debug.Assert(false);

            Console.ReadLine();
        }
    }
}

Ответ 5

Не можете ли вы просто исключить исключение, если !double.IsInfinity(x) вместо использования утверждения?

Ответ 6

Похоже, ваше приложение удалило TraceListener по умолчанию из класса Debug и заменило его на пользовательский, который по-разному реализует метод Fail(string).

Возможно, вы сможете отследить его, выполнив поиск кода Debug.Listeners и посмотрев, очищен или изменен ли файл по умолчанию, или посмотрите, есть ли у вас раздел trace в вашем app.config.

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

Ответ 7

Если вы используете DefaultTraceListener, вы можете добавить следующий раздел в свой app.config файл, который позволяет разбивать на Debug.Assert(false):

<configuration>
   <system.diagnostics>
      <assert assertuienabled="false"/>
   </system.diagnostics>
</configuration>

Подробнее см. assert element и Свойство DefaultTraceListener.AssertUiEnabled.