Ответ 1
Если по отладке вы имеете в виду использование функции "Step Into", см. этот ответ MS на проблему.
Использование "Step Over" в выражении 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).
Если по отладке вы имеете в виду использование функции "Step Into", см. этот ответ MS на проблему.
Использование "Step Over" в выражении Assert также решает проблему (для меня).
Вы можете использовать контрольную точку состояния для такого поведения, просто установите точку останова в строке, на которой вы хотите сломать, а затем щелкните правой кнопкой мыши на точке слева и выберите условие, во всплывающем окне введите желаемое условие (в вашем случае является double.IsInfinity(x))
Используйте метод Debugger.Break (в пространстве имен System.Diagnostics
). Это нарушит выполнение, если вы работаете в отладчике.
Кажется, что работа в ожидании для меня в консольном приложении по крайней мере: в отладочных сборках появляется всплывающее диалоговое окно, которое позволяет вам входить в приложение с помощью отладчика, но в сборках релизов ничего не происходит. По общему признанию, я просто использовал упрощенную 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();
}
}
}
Не можете ли вы просто исключить исключение, если !double.IsInfinity(x)
вместо использования утверждения?
Похоже, ваше приложение удалило TraceListener по умолчанию из класса Debug и заменило его на пользовательский, который по-разному реализует метод Fail(string)
.
Возможно, вы сможете отследить его, выполнив поиск кода Debug.Listeners
и посмотрев, очищен или изменен ли файл по умолчанию, или посмотрите, есть ли у вас раздел trace
в вашем app.config.
По умолчанию, из того, что я прочитал, вы обязательно должны получить всплывающее окно.
Если вы используете DefaultTraceListener
, вы можете добавить следующий раздел в свой app.config
файл, который позволяет разбивать на Debug.Assert(false)
:
<configuration>
<system.diagnostics>
<assert assertuienabled="false"/>
</system.diagnostics>
</configuration>
Подробнее см. assert
element и Свойство DefaultTraceListener.AssertUiEnabled.