Отладка – один из важных этапов разработки ПО. Есть много определений этого термина: начиная от “процесса нахождения ошибок на этапе разработки и их устранения”, до “убеждения, что алгоритм исполнения программы соответствует ожиданиям”.
Процесс отладки неминуемо следует за кодированием. Крайне рекомендуется проходить отладчиком по всему коду хотя-бы один раз после кодирования, ведь даже в самом простом коде могут быть ошибки. А если код сложнее
def my_function():
pass
то пройти по нему отладчиком даже необходимо и жизненно важно.
На практике я использую отладку на самых разных уровнях: иногда, нужно найти причину вывода отличного от ожидаемого значения в XLS-отчёт, иногда, зайти на сборку в CI-сервере и найти причину упавшего теста, иногда понять почему отчёт в JS-интерфейсе отличается от значений в базе, а иногда найти причину ошибки в одной из системных библиотек.
Для всего этого есть свои инструменты. В браузере – встроенный отладчик и ключевое слово debugger, в системе – gdb, strace, в Python – свои инструменты. Давайте рассмотрим их.
pdb
pdb – стандартный отладчик для Python 2/3. Самый простой, но в то же время достаточно мощный чтобы справиться с любой задачей отладки.
Для того чтобы запустить отладчик, достаточно написать в коде
import pdb; pdb.set_trace()
IPython pdb
idpb – расширенный pdb для среды IPython. Поддерживает подсветку синтаксиса и автодополнение. Это, пожалуй, мой основной способ отладки в консоли.
Для того чтобы запустить отладчик, достаточно вызывать в коде
import ipdb; ipdb.set_trace()
PyCharm Remote Debug
Удаленная отладка более репрезентативна чем консольный pdb. Часто используя инструмент с более богатым интерфейсом можно разобраться в проблема быстрее.
Изначально remote debugger поставляемый с PyCharm развивался в пределах среды Eclipse PyDev. Поставляемый с PyCharm компонент pydevd – форк, развиваемый командой JetBrains. Спасибо ребятам, они молодцы.
Как настроить удаленную отладку?
- Убедиться, что у вас PyCharm Professional Edition :)
- Настроить Remote Debugger в PyCharm.
- Убедиться что до вас можно достучаться по сети оттуда, где запускается python код. Можно, например, запустить локально netcat-сервер (“netcat -l”), а на хосте с кодом попытаться к этому порту подключиться netcat-клиентом. Если конфигурация сети сложная, всегда можно пробросить порт по SSH.
- Установить на сервер pip-пакет pydevd_pycharm.
- Добавить вызов отладчика в нужное место в коде.
import pydevd_pycharm
pydevd_pycharm.settrace('172.17.0.1', port=12345)
Когда Python выполнит этот код, произойдет следующее:
- выполнение программы остановится в этой точке;
- интерпретатор попытается соединиться с PyCharm, слушающим по адресу
172.17.0.1:12345
; - при успешном соединении PyCharm отобразит остановленный код.
Ключевой момент: Python-код соединяется с PyCharm-ом, а не наоборот.
VisualStudio Code – PTVSD
Удаленный отладчик VisualStudio Code – PTVSD – гораздо более новый продукт, чем отладчик встроенный в PyCharm. Еще год назад он болел детскими болезнями, наподобие невозможности настроить mapped paths. Однако сейчас, его вполне можно рекомендовать к ежедневному применению. Его большое преимущество перед отладчиком PyCharm – он бесплатен!
Как настроить удаленную отладку?
- Настроить удаленную отладку в VisualStudio Code.
- Убедиться, что ваш ПК может обратиться к порту, открытом на хосте где запускается код. Как и в случае с PyCharm можно пробросить порт по SSH, но использовать нужно не remote port forwarding метод, а local port forwarding, т.к. соединение произойдет из VSCode в Python.
- Установить pip-пакет ptvsd.
- Добавить в отлаживаемый участок кода (например, в вызов какой-либо функции) вызов отладчика.
import ptvsd ptvsd.enable_attach(address=('1.2.3.4', 3000))
ptvsd.wait_for_attach()
Ключевой момент: в отличии от PyCharm-отладчика, отладчик PTVSD сам инициирует сетевое соединение, а не ждет подключения к нему.
arm-отладчика, отладчик PTVSD сам инициирует сетевое соединение, а не ждет подключения к нему.
Заключение
Возможностей для отладки в Python более, чем достаточно и все они имеют свои преимущества и недостатки. Я пользуюсь ipdb и PyCharm + PyDevd в зависимости от ситуации.
- Если мне необходимо отладить код на dev или CI сервере, или нужно отладить код в чужой среде, то я выбираю ipdb, а при его отсутствии pdb. Еще одна причина использовать ipdb – отсутствие автоматической подгрузки дескрипторов.
- Если же мне необходимо полноценно видеть картину происходящего, иметь возможностью по-ходить по коду в среде разработки, то я выбираю отладчик PyCharm PyDevd.