Лекция: Основы pdb
На прошлой неделе на курсе Python для сетевых инженеров была лекция по основам pdb. Делюсь записью лекции и шпаргалкой по командам, возможно, кому-то ещё это пригодится.
Лекция
Полезные ресурсы
- The Python Debugger (pdb) - основы работы с pdb
- Python 3 Module of the Week. pdb — Interactive Debugger. Перевод на русский
- Python Debugging With Pdb - в конце статьи есть PDF со списком команд
- Nathan Yergler: In Depth PDB - PyCon 2014
- pdbr: pdb + Rich
Как запустить pdb
python -m pdb script.py
Для выхода из pdb используется команда q
.
В любой момент можно перезапустить скрипт, без потери breakpoint, с помощью команды run
.
Базовые команды передвижения по программе
- n (next) - выполнить все до следующей строки. Эта команда не заходит в функции, которые вызываются в строке
- s (step) - выполнить текущую строку, остановиться как можно раньше. Эта команда заходит в функции, которые вызываются в строке
- c (continue) - выполнить все до breakpoint. Также полезна, когда скрипт отрабатывает с исключением, позволяет дойти до строки, где возникло исключение
Контекст в скрипте, переменные
- l (list) - показывает следующую строку, которая будет выполняться и 5 строк до и после нее. При добавлении диапазона показывает указанные строки, например,
list 1, 20
покажет код с 1 по 20 строку - ll (longlist) - показывает весь метод или функцию в котором мы находимся
- a (args) - показывает аргументы функции (или метода) и их значения. Работает только внутри функции
- p - показывает значение переменной, работает как print. Синтаксис
p vara
, где vara имя переменной - pp - показывает значение переменной, работает как pprint. Синтаксис
pp vara
, где vara имя переменной
Выполнение Python команд в pdb
Любую команду можно выполнить указав !
перед ней:
!vara = 55
!result.append(vara)
Таким образом можно пробовать выполнить какие-то действия в текущем контексте программы, изменить значения переменных.
Также можно перейти в интерпретатор python из текущего контекста. Для этого используется команда interact:
(Pdb) interact
*interactive*
>>> print(cfg)
<_io.TextIOWrapper name='sh_cdp_n_sw1.txt' mode='r' encoding='UTF-8'>
>>> cfg.closed
False
>>>
>>> data = ['1','2','3']
>>> print(','.join(data))
1,2,3
>>>
now exiting InteractiveConsole...
(Pdb)
Для выхода из интерпретатор используется команда Ctrl-d
.
Дополнительные команды по передвижению
- until - выполнить все до указанной строки. Синтаксис
until 15
, где 15 номер строки - return - выполняется внутри функции и выполняет все до return
- u (up) - передвинутся на один уровень выше в стеке вызовов. Например, если мы по цепоцке переходили в один вызов функции, затем в друго, чтобы вернуться назад надо использовать up
- d (down) - передвинутся на один уровень ниже в стеке вызовов
Breakpoints
- b (break) - команда для установки breakpoint
Если команда указывается с аргументом, например, break 12
или break check_ip
, устанавливается breakpoint.
Без аргументов, команда показывает все установленные breakpoint.
Удаление breakpoint под номером 1:
clear 1
Базовые варианты установки breakpoint
Установить breakpoint в строке 12:
break 12
Установить breakpoint в первой строке функции check_ip:
break check_ip
Breakpoint с условием
Сделать breakpoint в строке 12, если значение переменной num будет больше 10:
break 12, num > 10
Привязка команд к breakpoint
Создаем breakpoint (предполагаем, что он первый, поэтому его номер будет 1):
break 12
Добавляем команды, которые будут выполняться каждый раз, когда попадаем на breakpoint (var1, var2, result_dict должны быть заменены на ваши переменные)
commands 1
pp var1
pp var2
pp result_dict
end