Шаг 4. Выполнение кода в отладчике

Предыдущий шаг: использование интерактивного окна REPL

Visual Studio предоставляет возможности для управления проектами, расширенные возможности редактирования, окно Интерактивный режим и инструменты полнофункциональной отладки для кода Python. В отладчике можно выполнять код пошагово, включая каждую итерацию цикла. Кроме того, можно приостанавливать программу, если выполняются определенные условия. При приостановке программы в отладчике можно полностью изучить ее состояние и изменить значения переменных. Эти действия необходимы для выявления источников ошибок в программе. Кроме того, они позволяют отслеживать поток работы программы.

  1. Замените код в файле PythonApplication1.py приведенным ниже кодом. Этот вариант кода расширяет make_dot_string, что позволяет изучать отдельные шаги в отладчике. Он также помещает цикл for в функцию main и выполняет его явным образом, вызывая эту функцию.

    from math import cos, radians
    
    # Create a string with spaces proportional to a cosine of x in degrees
    def make_dot_string(x):
        rad = radians(x)                             # cos works with radians
        numspaces = int(20 * cos(rad) + 20)          # scale to 0-40 spaces
        st = ' ' * numspaces + 'o'                   # place 'o' after the spaces
        return st
    
    def main():
        for i in range(0, 1800, 12):
            s = make_dot_string(i)
            print(s)
    
    main()
    
  2. Убедитесь, что код работает правильно, нажав клавишу F5 или выбрав команду меню Отладка>Начать отладку. Эта команда запускает код в отладчике. На сегодняшний день пока еще ничего не сделано для приостановки запущенной программы; просто выполняется печать шаблона волн для ряда итераций. Нажмите любую клавишу, чтобы закрыть окно вывода.

    Совет

    Чтобы закрыть окно вывода автоматически после завершения программы, выберите команду меню Сервис>Параметры, разверните узел Python, выберите Отладка и снимите флажок Ожидать входные данные при нормальном завершении работы процесса:

    Python debugging option to close the output window on normal program exit

    Дополнительные сведения об отладке и инструкции по настройке аргументов сценария и интерпретатора, см. в разделе Отладка кода Python.

  3. Установите точку останова в операторе for, щелкнув один раз серое поле возле этой строки или поместив курсор в этой строке и выбрав команду Отладка>Точка останова (клавиша F9). В сером поле появляется красная точка для указания точки останова (как показано ниже стрелкой):

    Setting a breakpoint

  4. Снова запустите отладчик (F5), и вы увидите, что выполнение кода остановится в строке с этой точкой останова. Здесь можно просмотреть стек вызовов и переменные. Переменные, относящиеся к области действия, приводятся в окне Видимые, если они определены. В нижней части этого окна можно также перейти к представлению Локальные.В нем отображаются все переменные, которые найдены средой Visual Studio в текущей области действия (включая функции), даже если они еще не определены.

    Breakpoint UI experience for Python

  5. Обратите внимание на панель инструментов отладки (показана ниже) в верхней части окна Visual Studio. Эта панель инструментов предоставляет быстрый доступ к наиболее часто используемым командам отладки (которые также находятся в меню Отладка).

    Essential debugging toolbar buttons

    Кнопки располагаются слева направо в следующем порядке:

    Кнопка Команда
    Продолжить (F5) Программа выполняется до следующей точки останова или до конца.
    Прервать все (Ctrl+Alt+Прервать) Приостанавливает работу долго выполняющейся программы.
    Остановить отладку (Shift+F5) Программа останавливается в текущем месте, и работа отладчика завершается.
    Перезапустить (Ctrl+Shift+F5) Программа останавливается в текущем месте и перезапускается в отладчике с начала.
    Показать следующую инструкцию (ALT+NUM*) Переключается на следующую строку кода для выполнения. Эта команда полезна в случае, если вы просматриваете код во время сеанса отладки и хотите быстро перейти к месту, где работа отладчика была приостановлена.
    Шаг с заходом (F11) Выполняет следующую строку кода с заходом в вызываемые функции.
    Шаг с обходом (F10) Выполняет следующую строку кода без захода в вызываемые функции.
    Шаг с выходом (Shift+F11) Текущая функция выполняется до конца, после чего выполнение приостанавливается в вызывающем коде.
  6. Выполните применительно к оператору for шаг с обходом с помощью команды Шаг с обходом. Пошаговое выполнение означает, что отладчик выполняет текущую строку кода, включая все вызовы функций, после чего сразу приостанавливает выполнение программы. Обратите внимание на то, как в коде переменная i теперь определена в окнах Локальные и Видимые.

  7. Выполните шаг с обходом в следующей строке, в которой вызывается функция make_dot_string. Шаг с обходом здесь нужен для того, чтобы отладчик выполнил всю функцию make_dot_string и приостановил работу, когда она завершится. Внутри функции работа отладчика не останавливается, если в ней нет отдельной точки останова.

  8. Выполните еще несколько шагов с обходом, наблюдая за тем, как меняются значения переменных в окнах Локальные и Видимые.

  9. В окне Локальные или Видимые в столбце Значение дважды щелкните поле переменной i или s, чтобы изменить ее значение. Чтобы применить изменение, нажмите клавишу Enter или щелкните в любой области за пределами поля со значением.

  10. Продолжите пошаговое выполнение кода с помощью команды Шаг с заходом. Шаг с заходом означает, что отладчик заходит во все вызываемые функции, о которых у него есть отладочные сведения, например make_dot_string. Внутри функции make_dot_string вы можете изучать ее локальные переменные и пошагово выполнять ее код.

  11. Продолжайте пошагово выполнять код с помощью команды Шаг с заходом и обратите внимание на то, что после достижения конца функции make_dot_string вы возвращаетесь в цикл for, а переменная s принимает новое значение. Когда вы снова перейдете к оператору print, обратите внимание на то, что выполнение шага с заходом для print не приводит к заходу в эту функцию. Связано это с тем, что функция print не написана на языке Python, а представляет собой машинный код внутри среды выполнения Python.

  12. Продолжайте выполнять шаги с заходом, пока вы снова не попадете в функцию make_dot_string. Теперь используйте команду Шаг с выходом и обратите внимание на то, что вы вернетесь в цикл for. Команда Шаг с выходом означает, что отладчик выполняет функцию до конца, а затем автоматически приостанавливает выполнение в вызывающем коде. Эту команду рекомендуется использовать, если вы уже обработали какую-то часть длинной функции, которая требует отладки. Она обработает остальную часть и не будет настраивать явную точку останова в вызывающем коде.

  13. Чтобы продолжить выполнение программы после достижения очередной точки останова, используйте команду Продолжить (F5). Так как вы установили точку останова в цикле for, при следующей итерации произойдет остановка.

  14. Пошаговое выполнение сотен итераций цикла может быть утомительным, поэтому в Visual Studio к точке останова можно добавить условие. В этом случае отладчик будет приостанавливать выполнение программы в точке останова, только если условие соблюдается. Например, можно настроить условие для точки останова в операторе for так, чтобы выполнение в ней прерывалось, только если значение переменной i превышает 1600. Чтобы задать это условие, щелкните правой кнопкой мыши красную точку, обозначающую точку останова, и выберите пункт Условия (сочетание клавиш Alt+F9>C). В появившемся всплывающем окне Параметры точки останова введите i > 1600 в качестве выражения и выберите Закрыть. Нажмите клавишу F5, чтобы продолжить работу, и обратите внимание на то, что до того, как произойдет следующий останов, будет выполнено несколько итераций.

    Setting a breakpoint condition

  15. Чтобы программа выполнялась до конца, отключите точку останова, щелкнув в поле точку правой кнопкой мыши и выбрав команду Выключить точку останова (CTRL+F9). Затем выберите команду Продолжить (или нажмите клавишу F5), чтобы запустить программу. Когда выполнение программы завершится, сеанс отладки в Visual Studio будет закрыт и вы вернетесь в режим редактирования. Можно также удалить точку останова, выбрав его точку или щелкнув правой кнопкой мыши точку и выбрав Удалить точку останова. При этом также удаляются все ранее заданные условия.

Совет

В некоторых ситуациях, например, когда не удается запустить интерпретатор Python, окно выходных данных может автоматически закрываться сразу после появления, из-за чего увидеть сообщения об ошибках невозможно. Если такое происходит, в обозревателе решений щелкните проект правой кнопкой мыши, выберите пункт Свойства, откройте вкладку Отладка и добавьте -i в поле Аргументы интерпретатора. Этот аргумент вынуждает интерпретатор перейти в интерактивный режим после завершения программы, оставив окно открытым, пока вы не нажмете клавиши CTRL+Z>ВВОД для выхода.

Следующий шаг

Дополнительные подробности