Отладка приложений

Команда Set Next Statement


Одним из самых известных скрытых свойств отладчика является команда Set Next Statement. Она доступна как в окне исходного кода, так и в окне Disassembly — по контекстному меню (открываемому щелчком правой кнопки мыши), но только тогда, когда выполняется отладка. Команда Set Next Statement позволяет изменять указатель инструкции (команды), т. е. устанавливать его на различные места программы. То же самое можно сделать и прямой установкой регистра EIP. Изменение точки выполнения программы — фантастическая отладочная техника, особенно если во время блочного тестирования требуется протестировать собственные обработчики ошибок.

Имейте в виду, если не проявить чрезвычайную осторожность, то изменение указателя инструкции может легко привести к аварийному завершению программы. Если программа выполняется в режиме отладки, то использование Set Next Statement не приводит к большим неприятностям. Однако в оптимизированном режиме финальной сборки безопаснее всего выполнять команду Set Next Statement только в окне Disassembly. Компилятор будет перемещать код так, что исходные строки могут и не выполняться линейно. Кроме того, нужно знать, создает ли ваш код временные переменные в стеке во время использования Set Next Statement. В главе 6 последняя ситуация рассмотрена более подробно.

Если гипотеза состоит в том, что обнаруженная ошибка могла быть в некоторой ветви кода, надо установить точку прерывания в отладчике перед подозрительной функцией или функциями. Затем проверить данные и параметры, входящие в функции и выполнить пошаговый проход через эти функции (step over). Если проблема не дублируется, выполните команду Set Next Statement, чтобы вернуть точку выполнения назад, к точке прерывания, и измените данные, входящие в функции. Эта тактика позволит протестировать несколько гипотез в одной отладочной сессии, экономя таким образом время. Нетрудно видеть, что невозможно применять эту технику во всех случаях, потому что, как только вы выполняете некоторый код в своей программе, его повторное выполнение может нарушить ее состояние. Set Next Statement лучше всего работает на коде, который не слишком сильно изменяет свое состояние.


Как упоминалось ранее, команда Set Next Statement удобна во время блочного тестирования. Например, она полезна, когда требуется тестировать обработчики ошибок. Скажем, в if-операторе необходимо проверить, что случится, если условие не выполнится. Все, что нужно сделать в этом случае, — это позволить условию выполниться и использовать команду Set Next Statement, чтобы переместить точку выполнения вниз, до ветви с отказом. В дополнение к Set Next Statement, одноразовую (one-shot) точку прерывания позволяет устанавливать пункт меню Run To Cursor, доступный также в меню Debug. При тестировании я также изредка использую Run To Cursor. Превосходный пример применения Set Next Statement для тестировании или отладке — заполнение структур данных (особенно списков и массивов). Пусть в некотором коде заполняется структура данных и затем эта структура добавляется к связному списку. Чтобы добавить к этому списку несколько дополнительных элементов, можно выполнить Set Next Statement (так что можно будет видеть, как выполняется обработка). Такое использование Set Next Statement особенно удобно, когда при отладке нужно установить режим трудно дублируемых данных.





Содержание раздела