
- •Введение в отладчик.
- •Подключение отладчика
- •Запуск отладчика
- •Разница между Step Over и Step Into
- •Run to Cursor
- •Значки инструментальной панели отладчика
- •Restart
- •Stop Debugging
- •Break Execution
- •Аpply Code Changes, Edit and Continue
- •Show Next Statement
- •Complete Word
- •Go To Definition/Reference
- •Insert/Remove Breakpoint
- •Окна отладчика
- •Окно Trace
- •Трассировка кода объекта
- •Трассировка процедурно-ориентированного кода
- •Окно Watch
- •Меню View I Debug Windows
- •Just-in-Time debugging
- •Страница Debug в окне Options
- •Раскладка клавиатуры
- •Короткие клавиши отладчика
Разница между Step Over и Step Into
Эти команды отладчика (клавиши F10 и F11) различаются только в случае, когда текущий оператор (т. е. тот, что будет исполняться при следующем нажатии F10 или F11) является вызовом функции или метода. Как подразумевает название Step Over, при нажатии F10 отладчик перешагивает через вызов, выполняя вызванную процедуру с максимальной скоростью, и останавливается на следующем после вызова операторе в вызывающей процедуре. В случае же Step Into, когда процедуру должно вызвать нажатие F11, отладчик входит в код вызванной процедуры (функции или метода) и останавливается на операторе внутри нее. При вызовах функций стандартных библиотек C/C++ пользуйтесь F10, а не F11 (Step Info), чтобы перешагнуть вызов и избежать отладки библиотечного кода.
Go
Подчас слишком долго приходится нажимать F10 или F11, прогоняя операторы по одному. Например, в хорошо написанных программах, использующих уже написанные и отлаженные ранее алгоритмы, проход через участки заведомо верных старых строчек может отнимать массу времени. В этом случае выполняйте команду Go (F5). Она выполняет вашу программу с полной скоростью до следующей контрольной точки (они обсуждаются ниже) или до самого конца.
Одно из самых полезных применений команды Go связано с отладкой циклов. Установка контрольной точки в теле цикла и последовательное нажатие F5 говорит отладчику, что выполнять тело цикла нужно на полной скорости. Применяйте этот подход для подсчета корректных итераций.
Run to Cursor
Команда Run to Cursor (CTRL+F10) похожа на Go, но не требует предварительно определенной контрольной точки. Вместо контрольной точки вы просто устанавливаете курсор редактора (т. н. I-beam) в любом месте строки, где нужно сделать остановку, и нажимаете CTRL+F10.
Значки инструментальной панели отладчика
Когда вы начинаете отлаживать программу любым из описанных в предыдущем разделе способов, по умолчанию на экране появляется инструментальная панель отладчика. Эту панель можно видеть на рис.4.Она расположена поверх окна Workspace. Если вам не нравится такое расположение, вы можете перетащить панель мышью в любое другое место. Разумеется, вы можете затащить панель на главное меню в качестве инструментальной линейки.
На
рис.5 показан увеличенный вид
инструментальной панели Debug. Далее
объясняется каждый из ее значков по
порядку слева направо (сначала верхний,
затем нижний ряд).
Рис.4. Увеличенная панель Debug.
Рис.5Начальная инструментальная панельDebug.
Restart
Значок Restart (CTRL+SHIFT+F5) говорит отладчику, что вы хотите запустить программу с самого начала, а не с текущей позиции отладки.
Stop Debugging
Если в какой-то момент фазы отладки вы сознаете, что проект или рабочее пространство необходимо обновить, то для возврата в меню Build необходимо нажать эту кнопку (клавиша SHIFT+F5), которая завершает отладчик.
Break Execution
Эта кнопка останавливает исполнение программу в текущей точке
Аpply Code Changes, Edit and Continue
Командой Apply Code Changes (ALT+F10), которая появилась в Visual C++ 6.0, вы можете внести в программу изменения исходного кода, произведенные в процессе отладки. Эта команда применяется при работе или приостановке программы в отладчике. Для внесения в отлаживаемую программу сделанных изменений выберите Apply Code Changes в меню Debug или четвертую кнопку инструментальной панели.
В случае включенной опции Edit and Continue можно вносить изменения автоматически по командам Go и Step (при выключенной автоматической опции вы можете вносить изменения командой Apply Code Changes.)
Чтобы включить/выключить автоматическое внесение изменений, нужно выбрать в меню Tools | Options, а затем закладку Debug. На странице Debug пометьте или сбросьте флажок Debug commands invoke Edit and Continue. Так как этот флажок относится к инструментальным опциям, а не к опциям проекта, его установка или сброс влияет сразу на все проекты, с которыми вы сейчас работаете. Кроме того, при изменении состояния опции не требуется перестраивать ваше приложение. Ее можно менять прямо в процессе отладки.
Информация, необходимая для автоматического внесения изменений, хранится в базе данных проекта. Когда вы создаете новый проект, в диалоге Project Settings выбирается соответствующая опция (Program Database for Edit and Continue). Если вы меняете эту опцию, Edit and Continue выключается.
Если вы хотите отключить Edit and Continue для конкретного проекта, то это можно сделать. Выберите в меню Project Settings, затем закладку C/C++ и категорию General. Затем откройте список Debug Info и выберите Program Database for Edit and Continue, чтобы включить или отключить опцию. Нажмите ОК и перестройте приложение.
Не включайте опцию Edit and Continue, если вы отлаживаете оптимизированный код. Она несовместима с оптимизациями, и вы получите сообщение компилятора об ошибке.
Типы изменений, которые нельзя автоматизировать
Вследствие особенностей внутреннего механизма Edit and Continue для общего размера новых переменных, добавленных в активную функцию, установлен предел в 64 байта. Активная функция - это любая функция, находящаяся в данный момент на стеке вызовов. С другой стороны, нет никакого ограничения на переменные функций, на стеке не находящихся. В следующем списке перечислены категории модификаций, которые автоматическое Edit and Continue обрабатывать не может:
• Обновление файлов ресурсов;
• Изменение кода в файлах только для чтения
• Изменение оптимизированного кода ключей /О1, /О2, /Og, /Ox, /Obl /Оb2;
• Модификация блоков обработки исключений;
• Модификация типов данных, включая определения классов, структур,объединений и перечислений;
• Введение новых типов данных;
• Удаление функций или изменения в прототипах;
• Изменение глобального или статического кода;
• Обновление исполняемых модулей, загруженных с другой машины и не построенных локально.
Если вы сделаете одно из вышеописанных изменений и попытаетесь внести модификации в выполняющийся код, то в окне Output появится сообщение об ошибке.