Причинение сбоя отладчика VS2010 при сбое Debug.Assert - PullRequest
12 голосов
/ 03 октября 2011

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

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

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

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

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

(Кстати: я разрабатываю настольное приложение на основе WPF. В приложении Windows Forms поведение кажется другим: здесь отладчик останавливается на Debug.Assert.)

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

Ответы [ 7 ]

6 голосов
/ 03 октября 2011

Если под отладкой вы имеете в виду использование функции «Step Into», посмотрите ответ этой проблемы на MS.

http://connect.microsoft.com/VisualStudio/feedback/details/522995/system-diagnostics-debug-assert-doesnt-pop-up-messagebox-correctly-when-step-into-it-in-vs-2010-and-2008

Использование «Step Over» в операторе Assert решаеттоже проблема (для меня).

1 голос
/ 03 октября 2011

В консольном приложении он работает, как и ожидалось, по крайней мере: в отладочных сборках появляется диалоговое окно, позволяющее вам проникнуть в приложение с помощью отладчика, но в сборках выпуска ничего не происходит. По общему признанию, я только использовал упрощенный 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();
        }
    }
}
1 голос
/ 03 октября 2011

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

1 голос
/ 03 октября 2011

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

0 голосов
/ 30 октября 2014

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

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

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

0 голосов
/ 03 октября 2011

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

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

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

0 голосов
/ 03 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...