Почему условная точка останова снижает скорость выполнения приложения во время отладки?

StackOverflow https://stackoverflow.com/questions/535779

Вопрос

Когда я использую условную точку останова в VS2005 вместо использования временного кода для проверки определенных условий, я заметил, что это занимает больше времени и скорость выполнения снижается!Ты знаешь почему?и как решить эту проблему?

Пример:

    int sequence = atoi(m_SequenceNumber.GetAscii());
    if( sequence == 392914)//temporary code to check to step into code
    {
        int x = 0;//I put breakpoint here
    }

Предыдущий код будет выполняться быстрее, чем если бы я использовал условную точку останова (последовательность == 392914).

Это было полезно?

Решение

Лучше (если возможно) использовать точку наблюдения за памятью, чем условную точку останова.Условная точка останова (как указывали другие) должна запускать дополнительный код каждый раз, когда указатель выполнения проходит мимо этой точки, чтобы определить, сломается она или нет - очевидно, что это требует дополнительного времени.Точка наблюдения за памятью определенного типа может использовать определенные специальные аппаратные регистры — существует ограничение на количество точек наблюдения, которые вы можете установить и которые могут ускоряться, но если вы можете их использовать, штрафа за скорость почти нет.

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

На самом деле я сейчас не сижу перед VS, но, грубо говоря, вы щелкаете правой кнопкой мыши в окне точек останова и выбираете что-то вроде «новой точки останова данных».Затем вы вводите адрес памяти и размер в байтах.Всякий раз, когда значение изменяется, ваша точка наблюдения срабатывает.Это особенно полезно для выявления проблем с повреждением памяти.

Другие советы

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

if ( condition ) Debugger.Break();

Подумайте, как бы вы реализовали условную точку останова, если бы писали отладчик.Единственный раз, когда отладчик имеет возможность оценить условие, — это достижение точки останова.Таким образом, хотя с вашей точки зрения точка останова является условной, с точки зрения процессора точка останова срабатывает каждый раз, когда выполняется инструкция.Отладчик получает управление и делает следующее:

  • определяет, что точка останова является условной
  • оценивает выражение
  • если выражение ложно, отладчик продолжает выполнение
  • в противном случае отладчик передает управление вам.

Таким образом, даже если вы никогда не увидите попадание в точку останова (поскольку условие не выполнено), отладчик может устанавливать точку останова и оценивать условие тысячи раз в секунду (а может, и больше).

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

Добавленный временный код может быть оптимизирован (хотя бы немного) компилятором.Условная точка останова, вероятно, переходит к некоторому коду визуальной студии, который вручную получает необходимую информацию, чтобы узнать, действительно ли ему нужно приостановить работу или нет.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top