2009-02-11 3 views
7

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

Exmaple:

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)

+1

это убивает меня в vs2010. довольно тяжелый цикл, но обычно завершается за 1 секунду .. с условным, он никогда не завершается. –

ответ

4

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

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

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

+0

Можете ли вы рассказать о том, как использовать точку наблюдения за памятью? –

0

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

0

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

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

1

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

if (condition) Debugger.Break(); 
2

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

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

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

+0

Это точно так, если бы я писал отладчик, я бы нашел способ скомпилировать условие точки останова на месте с использованием какой-либо техники джитта (напрямую изменить исполняемый файл), что невозможно. – deemok

+0

Это хороший момент, и интересная идея - вы правы, что что-то подобное не будет невозможно. Особенно в средах, которые уже используют JIT. –

+0

Вы можете прикрепить отладчик к существующему процессу. Я думаю, что это значительно увеличит сложность подхода JIT-инъекций, учитывая, что исполняющая программа уже скомпилировала MSIL в native, поскольку она уже запущена. Что вы делаете в этом сценарии? Вам нужно будет заставить структуру динамически заканчивать код JIT'd, вводить свой код точки останова в MSIL, а затем повторно JIT на лету? Это уже очень сложно. – Shiv

 Смежные вопросы

  • Нет связанных вопросов^_^