Как сделать отладку в пайтоне

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

По умолчанию модуль asyncio работает в режиме production. Для облегчения разработки в asyncio есть режим отладки.

Содержание:

loop.get_debug() :

Метод loop.get_debug() проверяет, включен ли режим отладки цикла событий.

Если для переменной среды PYTHONASYNCIODEBUG задана непустая строка, то возвращает True , в противном случае - False .

loop.set_debug(enabled: bool) :

Метод loop.set_debug() устанавливает режим отладки цикла событий.

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

Изменено в версии 3.7: режим разработки Python теперь также можно использовать для включения режима отладки.


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

Когда нет под рукой PuDB и не имеется возможности его установить, либо плывет графика в urwid я использую pdb.

Отладчик pdb внешне похож на gdb.

Использование отладчика

Запускаем отладчик так:

Либо в коде можно указать место откуда надо запускать отладчик:

А post-mortem запускается так:

Для тех кто не знает что такое post-mortem, то это режим в котором отладчик стартует сразу после необработанного исключения.

Список команд отладчика

  • h(elp) - отладчик выведет список допустимых команд. Выполните help для того чтобы получить справку по конкретной команде;
  • q(uit), exit - выход из отладчика.

Общие команды

  • l(ist) [ [, ]] - печать исходного кода. Без передачи аргументов выводится +5 сверху и +5 снизу строк кода. Можно передать два аргумента "first" и "last" - номера строк диапазон которых надо выводить, если передать только один аргумент, то произойдет вывод +5 сверху и +5 снизу строк относительно указанного номера строки;
  • p , pp - "print" и "pprint" соответственно;
  • a(rgs) - выводит аргументы функции;
  • whatis - выведет тип объекта;
  • alias [ [ [

. ]]] - установить алиас на какую либо команду, например:


Алисы, помимо команд отладчика и инструкций интерпретатора могут вызывать другие алиасы. Выполнение без аргументов отображает список установленных алиасов, а если передать имя алиаса в качестве аргумента, то выведится его содержимое.
Для работы с аргументами алиаса нужно использовать следующий формат % , а для обращения ко всем аргументам используйте %*, пример:


Тем самым вы не выходите из сессии, и если у вас есть к примеру брейкпоинты, то вы их не потеряте. Также есть встроенный алиас restart, который запускает run без аргументов;

! - префикс для работы напрямую с интерпретатором, например вызов функций или обращение к переменным, всё что следует после префикса будет отправлено интерпретатору на выполнение, пример:

Навигация по коду

  • w(here) - выводит информаию о позиции в которой сейчас находитесь;
  • s(tep) - "step into", перейти во внутрь вызова объекта, если это возможно, иначе перейти к следующей строке кода;
  • n(ext) - "step over" (перешагнуть), перейти к следующей строке кода;
  • unt(il) - перейти к следующей строке кода, но гарантировано чтобы номер строки был больше чем текущий. Пример: если вы находитесь в конце тела цикла, но это не последняя итерация, то вас не отправит в начало тела цикла, а выполнится весь цикл и отладчик встанет на следующей строке после цикла, в отличии от next;
  • r(eturn) - завершить ("выйти из") текущую функцию;
  • u(p) - подняться на один стек-фрейм вверх;
  • d(own) - опуститься на один стек-фрейм вниз;
  • j(ump) - перепрыгнуть на указанную строку кода не выполняя код находящийся между текущей позицией и указанной. Исключение составляют циклы for и код в блоке finally (т.к. должен быть обязательно выполнен). Также, вы можете перепрыгивать только внутри текущего фрейма (т.е. нижнего фрейма).

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

Далее просто "брейкопоинты", потому что мне привычнее их так называть.

    При использовании листинга (команда "list") строки с брейкпоинтами помечаются префиксом "B":


Для просмотра текущих установленных брейпоинтов, используйте команду break без аргументов:


Отдельно стоит рассмотреть брейкпоинты с условием, брейкпоинт сработает если только условие будет верно, пример:

disable [ . ] и enable [ . ] - первый деактивирует брейкпоинт, но НЕ удаляет его из списка брейкпоинтов. А второй снова активирует брейкпоинт, пример:

commands [ ] - написание дополнительных действий для брейкпоинта, например вывод локальных переменных и т.п. Пример:


Для удаления необходимо снова запустить commands, но с пустым телом:

Сохранение настроек конфигурации

Для настроек pdb необходимо создать файл .pdbrc в корне домашней директории, либо в корне проекта. При этом совпадающие инструкции находящиеся в корне проекта переопределят тех кто находятся в корне домашней директории.

Пример файла ~/.pdbrc:

Пример файла ~/work/project/.pdbrc:

Интеграция с Emacs

Во многих IDE есть поддержка pdb, не исключение и Emacs, достаточно запустить так:

И вам предстанет консоль pdb в одной панели, а в другой реалтайм-листинг кода, почти PuDB, но всеравно менее удобнее.

Модуль pdb в Python предоставляет разработчикам интерактивную среду для отладки программ. Сегодня мы рассмотрим примеры отладчика Python с использованием модуля pdb.

pdb предоставляет нам огромные возможности для эффективной отладки кода Python. Это включает в себя:

  • Приостановление программы.
  • Просмотр значений переменных.
  • Выполнение программы в каждой строке.

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

Запуск отладчика

Ну, дело не в программе. Мы можем запустить pdb с любой программой. Вот пример:

Посмотрим на результат этой программы:

Запуск отладчика

Запуск pdb в программе

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

Для этого мы используем pdb в самих программах. Посмотрим на фрагмент кода:

Давайте посмотрим на результат этой программы:

Запуск pdb в программе

Yажмите n и Enter, чтобы перейти к следующей строке и наблюдать за выполнением.

Post-mortem debugging

Когда программа завершает процесс выполнения, устранение сбоя в ней называется Post-mortem debugging . Модуль поддерживает это также с несколькими дополнительными функциями:

 mortem debugging

Проверка переменных в стеке

Один из моментов использования отладчика заключается в том, что мы должны иметь возможность проверять стек программы и то, какие переменные хранятся в этом стеке во время выполнения программы. Мы также можем сделать это с помощью pdb. Посмотрим на фрагмент кода:

Это простой пример рекурсии. Посмотрим на результат этой программы:

recursive stack

Обратите внимание, что мы использовали команду where для печати переменных в стеке. Мы также можем напечатать конкретную переменную как:

Печать переменной

Для переменных, которые могут содержать большие значения, такие как данные файла и т.д., мы также печатаем значения. Итак, если переменные – это данные, мы можем запустить команду:

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

Использование n для перехода к следующей строке полезно, но что, если вы действительно знаете, где остановиться? Отладка всей программы и перемещение по каждой строке утомительны.

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

На самом деле, ничего необычного. Давайте посмотрим на демонстрацию этой программы:

python pdb breakpoint

Мы использовали break ключевое слово вместе с номером строки, в которой мы хотим установить точку остановки.

Управление точками остановки

Как мы видели в последней демонстрации, когда мы применяли точку остановки к строке, ей был назначен идентификатор 1. Числовая часть может использоваться в качестве идентификатора для интерактивного включения и отключения этих точек. Отключение с помощью ключевого слова disable сообщает отладчику не останавливать выполнение при достижении этой строки. Точка остановки все еще сохраняется, но игнорируется.

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

Связанные

ОТВЕТЫ

Ответ 1

Вы можете использовать модуль pdb, вставить pdb.set_trace() в любом месте и он будет функционировать как точка останова.

Чтобы продолжить выполнение, используйте c (или cont или continue ).

ipdb - это версия pdb для IPython. Это позволяет использовать pdb со всеми функциями IPython, включая вкладку.

Также возможно установить pdb для автоматического запуска на неперехваченное исключение.

Pydb была написана как усовершенствованная версия Pdb. Преимущества?

Ответ 2

Его цель - предоставить все тонкости современных отладчиков на основе графического интерфейса в более легком и удобном для клавиатуры пакете. PuDB позволяет отлаживать код прямо там, где вы пишете и тестируете его - в терминале. Если вы работали с превосходными (но ныне древними) DOS-основанными Turbo Pascal или инструментами C, пользовательский интерфейс PuDB мог бы выглядеть знакомым.

pudb screenshot

Приятно для отладки автономных скриптов, просто запустите

Ответ 3

Если вы используете pdb, вы можете определить псевдонимы для ярлыков. Я использую их:

Ответ 4

Logging

Если он снова исчезнет, ​​вот те шаблоны, о которых я упоминал. Это код, взятый из блога; Я не писал это.

И вот его объяснение, как использовать вышеизложенное. Опять же, я не получаю за это кредит:

Ответ 5

code.interact выводит вас в интерактивную консоль

Если вы хотите иметь возможность легко получить доступ к истории консоли, посмотрите: " Могу ли я иметь механизм истории, например, в оболочке?" (придется смотреть на него).

Автозаполнение может быть включено для интерпретатора.

Ответ 6

ipdb подобен pdb, с удивительностью ipython.

Ответ 7

  • Некоторые люди рекомендуют функцию debug_print вместо печати для легкого отключения
  • Модуль pprint неоценим для сложных структур

Ответ 8

очевидный способ отладки script

  • полезно, когда script вызывает исключение
  • полезно при использовании команды virtualenv и pdb не запускается с версией pvtv venvs.

если вы точно не знаете, где находится script

Ответ 9

PyDev

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

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

Ответ 10

Если вы знакомы с Visual Studio, Python Tools для Visual Studio - это то, что вы ищете.

enter image description here

Ответ 11

Winpdb очень приятно, и вопреки его имени он полностью кросс-платформенный.

Он получил очень хороший отладчик на основе подсказок и GUI и поддерживает удаленную отладку.

Ответ 12

В Vim у меня есть три привязки:

rpdb2 - удаленный отладчик Python, который можно использовать с WinPDB, сплошным графическим отладчиком. Поскольку я знаю, что вы спросите, он может делать все, что я ожидаю от графического отладчика:)

Я использую pdb из nose.tools , чтобы я мог отлаживать модульные тесты, а также обычный код.

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

Ответ 13

Кроме того, отладчики, упомянутые в других ответах, будут использовать методы repr().

Ответ 14

Получение трассировки стека из запущенного приложения Python

Здесь есть несколько трюков . К ним относятся

  • Включение в интерпретатор/печать трассировки стека путем отправки сигнала
  • Получение трассировки стека из неподготовленного процесса Python
  • Запуск интерпретатора с флагами, чтобы сделать его полезным для отладки

Ответ 15

Если вам не нравится проводить время в отладчиках (и не оценивайте плохое использование интерфейса командной строки pdb ), вы можете сбросить выполнение trace и проанализировать его позже. Например:

Это приведет к тому, что все исходные строки выполнения setup.py install будут выполняться до execution.log .

Чтобы упростить настройку вывода трассировки и написать собственные трассировщики, я собрал некоторые фрагменты кода в модуль xtrace (общедоступный домен).

Ответ 16

Когда это возможно, я отлаживаю использование M-x pdb в emacs для отладки исходного уровня.

Ответ 17

Существует полный онлайн-курс под названием "" Отладка программного обеспечения" Андреаса Целлера по Udacity, в котором есть советы по отладке:

Резюме курса

В этом классе вы узнаете, как систематически отлаживать программы, как для автоматизации процесса отладки и создания нескольких автоматизированных инструменты отладки в Python.

Зачем брать этот курс?

В конце этого курса у вас будет хорошее понимание систематическая отладка, будет знать, как автоматизировать отладку и будет создали несколько функциональных отладочных инструментов в Python.

Предпосылки и требования

Базовые знания программирования и Python на уровне Udacity CS101 или лучше. Основное понимание объектно-ориентированного программирование полезно.

Читайте также: