Профилирование и отладка кода в Python

6935

Профилирование и отладка кода в Python

Visual Studio предоставляет широкие возможности отладки для Python, включая присоединение к выполняемым процессам, вычисление выражений в окнах контрольных значений и интерпретации, проверку локальных переменных, точки останова, инструкции «Шаг с заходом», «Шаг с выходом», «Шаг с обходом», команду Задать следующий оператор и многое другое.

 Совет

Python в Visual Studio поддерживает возможность отладки без проекта. Откройте в редакторе автономный файл Python, щелкните область редактора правой кнопкой мыши и выберите пункт Запуск с отладкой. Visual Studio запустит скрипт с глобальной средой по умолчанию (см. статью о средах Python) и без аргументов. В дальнейшем у вас будет полная поддержка отладки.

Чтобы управлять средой и аргументами, создайте проект для кода, что можно легко сделать с помощью шаблона проекта На основе существующего кода Python.

Основы отладки

Базовый рабочий процесс отладки включает в себя настройку точек останова, пошаговое выполнение кода, проверку значений и обработку исключений, как описано в следующих разделах.

Сеанс отладки можно начать с помощью команды Отладка > Начать отладку, кнопки Запуск на панели инструментов или клавиши F5. В результате запускается файл запуска проекта (выделен полужирным шрифтом в обозревателе решений) с активным окружением проекта и аргументами командной строки или путями поиска, указанными в свойствах проекта (см. раздел Параметры отладки проекта). Если в Visual Studio 2017 версии 15.6 и более поздних версий не задан файл запуска, отображается оповещение. В более ранних версиях может открыться окно вывода с выполняющимся интерпретатором Python либо же окно вывода может появиться на короткий промежуток времени и исчезнуть. В любом из этих случаев щелкните правой кнопкой мыши нужный файл и выберите пункт Задать как файл запуска.

Примечание

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

Точки останова

Точки останова прекращают выполнение кода в заданной точке, чтобы вы могли проверить состояние программы. Задайте точку останова, щелкнув левое поле редактора кода или щелкнув правой кнопкой мыши строку кода и выбрав пункт Точка останова > Вставить точку останова. В каждой строке с точкой останова отображается красная точка.

Профилирование и отладка кода в Python
Профилирование и отладка кода в Python

Чтобы удалить точку останова, щелкните красную точку или правой кнопкой мыши щелкните строку кода и выберите пункт Точка останова > Удалить точку останова. Ее также можно просто отключить с помощью команды Точка останова > Отключить точку останова.

Примечание

Некоторые точки останова в коде Python могут быть неожиданными для тех разработчиков, которые привыкли использовать другие языки программирования. При использовании языка Python весь файл является исполняемым кодом, таким образом Python запускает файл во время загрузки для обработки определений классов верхнего уровня или функций. Если задана точка останова, отладчик может остановиться в процессе объявления класса. Это верное, хотя и несколько неожиданное поведение.

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

При задании условий можно также задать действие, создать сообщение для создания записи в окне вывода и при необходимости настроить автоматическое продолжение выполнения. При этом создается так называемая точка трассировки, при этом добавлять код ведения журнала непосредственно в приложение не требуется:

Пошаговое прохождение кода

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

Функция Нажатие клавиш Описание
Continue F5 Код выполняется до следующей точки останова.
Шаг с заходом F11 Выполняется следующий оператор, после чего процесс останавливается. Если следующий оператор является вызовом функции, отладчик останавливается на первой строке вызываемой функции.
Шаг с обходом F10 Выполняется следующий оператор, включая вызов функции (выполняя весь ее код), и применяется любое возвращаемое значение. Пошаговое выполнение позволяет легко пропустить функции, которые не нужно отлаживать.
Шаг с выходом SHIFT+F11 Код выполняется до окончания текущей функции, а затем переходит к вызывающей инструкции. Эта команда полезна в том случае, если не требуется отладка остальной части текущей функции.
Выполнить до текущей позиции CTRL+F10 Код выполняется до расположения курсора в редакторе. Эта команда позволяет легко пропустить сегмент кода, для которого не нужно делать отладку.
Задать следующий оператор CTRL+SHIFT+F10 Текущая точка выполнения в коде изменяется на расположение курсора. Эта команда позволяет полностью пропустить выполнение сегмента кода, например, если известно, что код неисправен или приводит к нежелательным побочным эффектам.
Показать следующий оператор ALT+NUM * Переход к следующему выполняемому оператору. Эта команда удобна, когда вы изучаете код и не помните, где остановился отладчик.

 

Просмотр и изменение значений

При остановке отладчика можно проверить и изменить значения переменных. Окно контрольных значений позволяет отслеживать отдельные переменные, а также пользовательские выражения. (Общие сведения см. в статье Проверка переменных.)

Чтобы просмотреть подсказку для значения, просто наведите указатель мыши на любую переменную в редакторе. Щелкните значение, чтобы изменить его:

Окно видимых переменных (Отладка > Окна > Видимые) содержит переменные и выражения, близкие к текущему оператору. Чтобы изменить значение, дважды щелкните в столбце значения или выберите и нажмите клавишу F2.

Окно локальных переменных (Отладка > Окна > Локальные) содержит все переменные в текущей области, которые можно изменить.

Дополнительные сведения об использовании окон Видимые и Локальные см. в статье Проверка переменных в окнах «Видимые» и «Локальные».

Окно контрольных значений (Отладка > Окна > Контрольное значение > Контрольные значения 1–4) позволяет вводить произвольные выражения Python и просматривать результаты. Выражения повторно вычисляются для каждого шага:

Дополнительные сведения об использовании контрольного значения см. в статье Установка контрольных значений для переменных с помощью окон «Контрольное значение» и «Быстрая проверка».

При проверке строковых значений (в данном случае strunicodebytes и bytearray считаются строками) справа от них появляется значок лупы. При щелчке этого значка отображается всплывающее диалоговое окно со строковым значением без кавычек, с переносом по словам и прокруткой, что удобно при работе с длинными строками. Щелкнув стрелку раскрывающегося списка возле значка, можно выбрать тип визуализации: обычный текст, HTML, XML и JSON.

Визуализации JSON, HTML и XML отображаются в отдельных всплывающих окнах с подсветкой синтаксиса и представлением в виде дерева.

Исключения

Если в процессе отладки возникает ошибка, для которой нет обработчика исключений, отладчик останавливается в точке исключения.

На этом этапе можно проверить состояние программы, включая стек вызовов. При попытке выполнить пошаговую отладку кода исключение продолжает появляться, пока не будет обработано или пока не завершится программа.

Команда меню Отладка > Окна > Параметры исключений выводит окно, в котором можно развернуть исключения Python:

Флажок каждого исключения определяет, всегда ли должен останавливаться отладчик при возникновении исключения. Установите этот флажок, если требуется чаще прерывать выполнение для конкретного исключения.

По умолчанию большинство исключений прерываются, если обработчик исключений не обнаруживается в исходном коде. Чтобы изменить такое поведение, щелкните правой кнопкой мыши любое исключение и измените значение параметра Продолжить после необработанной ошибки в коде пользователя. Снимите этот флажок, если требуется прерывать исключение реже.

Чтобы настроить исключение, которое не отображается в этом списке, нажмите кнопку Добавить. Имя добавляемого исключения должно соответствовать полному имени исключения.

Параметры отладки проекта

По умолчанию отладчик запускает программу с помощью стандартного средства запуска Python без аргументов командной строки и других особых путей или условий. Параметры запуска можно изменить с помощью свойств отладки проекта, щелкнув правой кнопкой мыши проект в обозревателе решений и выбрав пункт Свойства, а затем вкладку Отладка.

Параметры режима запуска

Параметр Описание
Стандартное средство запуска Python Используется при отладке кода, написанного на портативном Python, совместимом с интерпретатором CPython, IronPython и такими версиями, как Stackless Python. Он обеспечивает самую удобную отладку чистого кода Python. Это средство запуска используется при присоединении к выполняющемуся процессу python.exe. Также это средство запуска предоставляет возможность отладки в смешанном режиме для CPython, что позволяет беспрепятственно переключаться между кодом C/C++ и кодом Python.
Веб-средство запуска Запускает браузер по умолчанию при загрузке и позволяет выполнять отладку шаблонов. Дополнительные сведения см. разделе Debugging (Отладка).
Веб-средство запуска Django Аналогично веб-средству запуска и отображается только для обеспечения обратной совместимости.
Средство запуска IronPython (.NET) Использует отладчик .NET, который работает только с IronPython, но позволяет переключаться между любыми проектами на языке .NET, включая C# и VB. Это средство запуска используется при присоединении к выполняющемуся процессу .NET, в котором размещается IronPython.

Параметры запуска (пути поиска, аргументы запуска и переменные среды)

Параметр Описание
Пути поиска Эти значения совпадают со сведениями, отображаемыми в узле Пути поиска проекта в обозревателе решений. Это значение можно изменить здесь, но проще использовать обозреватель решений, где можно просматривать папки и пути автоматически преобразуются в относительную форму.
Аргументы скрипта Эти аргументы добавляются к команде, используемой для запуска скрипта, и отображаются после имени файла скрипта. Первый элемент доступен для скрипта в виде sys.argv[1], второй в виде sys.argv[2] и т. д.
Аргументы интерпретатора Эти аргументы добавляются в командную строку средства запуска перед именем скрипта. Существуют следующие общие аргументы: -W ... для управления предупреждениями, -O для незначительной оптимизации программы и -u для использования операций ввода-вывода без буферизации. Пользователи IronPython могут использовать это поле для передачи параметров -X, таких как -X:Frames или -X:MTA.
Путь к интерпретатору Переопределяет путь, связанный с текущей средой. Значение может быть полезным при запуске скрипта с нестандартным интерпретатором.
Переменные среды В этом многострочном текстовом поле можно добавить записи в формате <NAME>=<VALUE>. Так как этот параметр применяется последним поверх существующих переменных глобальной среды и после того, как установлен PYTHONPATH в соответствии с параметром Пути поиска, он может использоваться для переопределения любой из этих переменных в ручном режиме.

Интерактивное окно и окно интерпретации

Существуют два интерактивных окна, которые можно использовать во время сеанса отладки: стандартное окно интерпретации Visual Studio и интерактивное окно отладки Python.

Окно интерпретации (Отладка > Окна > Интерпретация) используется для быстрого вычисления выражений Python и проверки или назначения переменных в выполняющейся программе. Дополнительные сведения см. в статье Окно интерпретации.

Интерактивное окно отладки Python (Отладка > Окна > Интерактивное окно отладки Python) имеет больше возможностей, обеспечивая работу в интерактивной среде REPL во время отладки, включая написание и выполнение кода. Оно автоматически подключается к любому процессу, запущенному в отладчике с помощью стандартного средства запуска Python (включая процессы, присоединенные с помощью команды Отладка > Присоединение к процессу). Тем не менее оно недоступно при использовании отладки в смешанном режиме C/C++.

Интерактивное окно отладки поддерживает специальные команды метаданных в дополнение к стандартным командам REPL.

Команда Аргументы Описание
$continue$cont$c Запускает выполнение программы, начиная с текущего оператора.
$down$d Переместите текущий кадр на один уровень вниз в трассировке стека.
$frame Отображает идентификатор текущего кадра.
$frame Идентификатор кадра Переключает текущий кадр на кадр с указанным идентификатором.
$load Загружает команды из файла и выполняет их до завершения.
$proc Отображает идентификатор текущего процесса.
$proc Идентификатор процесса Переключает текущий процесс на процесс с указанным идентификатором.
$procs Отображает список отлаживаемых в текущий момент процессов.
$stepin$step$s При возможности выполняет шаг с заходом в следующий вызов функции.
$stepout$return$r Выходит из текущей функции.
$stepover$until$unt Обходит вызов следующей функции.
$thread Отображает идентификатор текущего потока.
$thread Идентификатор потока Переключает текущий поток на поток с указанным идентификатором.
$threads Отображает список отлаживаемых в текущий момент потоков.
$up$u Переместите текущий кадр на один уровень вверх в трассировке стека.
$where$w$bt Отображает список кадров текущего потока.

Обратите внимание, что стандартные окна отладчика, такие как окно процессов, окно потоков и окно стека вызовов, не синхронизируются с интерактивным окном отладки. Изменение активного процесса, потока или кадра в интерактивном окне отладки не влияет на другие окна отладки. Аналогичным образом, изменение активного процесса, потока или кадра в других окнах отладчика не влияет на интерактивное окно отладки.

Использование отладчика предыдущих версий

Visual Studio 2017 версии 15.8 и более поздних версий использует отладчик на основе ptvsd версии 4.1 и более поздних. Эта версия ptvsd совместима с Python 2.7 и Python 3.5+. Если вы используете Python 2.6 и 3.1–3.4 или IronPython, Visual Studio отображает ошибку Отладчик не поддерживает эту среду Python:

В этих случаях необходимо использовать отладчик прежних версий (это происходит по умолчанию в Visual Studio 2017 версии 15.7 и более ранних версий). Выберите команду меню Сервис > Параметры, перейдите в каталог Python > Отладка и выберите Использовать отладчик предыдущих версий.

Если вы установили в текущей среде более раннюю версию ptvsd (например, для удаленной отладки нужна более ранняя версия 4.0.x или 3.x), Visual Studio отображает ошибку или предупреждение.

Ошибка Не удалось загрузить пакет отладчика появляется, когда вы установили ptvsd 3.x:

В этом случае выберите Использование отладчика предыдущих версий, нажмите Использовать отладчик предыдущих версий и перезапустите отладчик.

Предупреждение Пакет отладчика устарел появляется, если вы установили более раннюю версию ptvsd 4.x:

Важно!

Хотя вы можете пропустить это предупреждение для некоторых версий ptvsd, Visual Studio может работать неправильно.

Для управления установкой ptvsd:

  1. Перейдите на вкладку Пакеты в окне Окружения Python.
  2. В поле поиска введите «ptvsd» и проверьте установленную версию ptvsd:

3. Если версия ниже, чем 4.1.1a9 (версия в составе Visual Studio), нажмите X справа от пакета, чтобы удалить старую версию. Затем Visual Studio будет использовать версию, входящую в комплект. (Также можно удалить версию в PowerShell с помощью pip uninstall ptvsd.)

4. Кроме того, можно обновить пакет ptvsd до последней версии, следуя инструкциям из раздела Устранение неполадок.

Устранение неполадок

При наличии проблем с отладчиком сначала обновите версию ptvsd следующим образом.

  1. Перейдите на вкладку Пакеты в окне Окружения Python.
  2. Введите ptvsd --upgrade в поле поиска и выберите Выполнить команду: pip install ptvsd —upgrade. (Также можно использовать эту из PowerShell.)

Если проблемы не удается устранить, отправьте сообщение о проблеме в репозиторий PTVS на сайте GitHub.

Включение ведения журнала отладчика

В ходе исследования проблемы с отладчиком сотрудники Майкрософт могут попросить вас включить и собрать журналы отладчика, которые помогут при диагностике.

Следующие шаги позволяют включить отладку в текущем сеансе Visual Studio.

  1. Откройте командное окно в Visual Studio с помощью команды меню Вид > Other Windows (Другие окна) > Command Window (Окно команд) .
  2. Введите следующую команду:
    ps
    DebugAdapterHost.Logging /On /OutputWindow
    
  3. Запустите отладку и выполните действия, необходимые для воспроизведения проблемы. В это время журналы отладки отображаются в окне Выходные данные в разделе Журнал размещения адаптеров отладки. Затем можно скопировать журналы из этого окна и вставить в описание проблемы на сайте GitHub, сообщение электронной почты и т. д.

4. Если Visual Studio перестает отвечать на запросы или не удается получить доступ к окну Выходные данные по другой причине, перезапустите Visual Studio, откройте окно командной строки и введите следующую команду:

ps
DebugAdapterHost.Logging /On

5. Начните отладку и снова воспроизведите проблему. Затем журналы отладчика можно будет найти в файле %temp%\DebugAdapterHostLog.txt.

источник