Модуль pdb
определяет интерактивный отладчик исходного кода для программ Python. Он поддерживает установку условных точек останова и пошаговое выполнение на уровне строки исходного кода, проверку стековых фреймов, листинг исходного кода и оценку произвольного кода Python в контексте любого стекового фрейма. Он также поддерживает посмертную отладку и может вызываться под управлением программы.
Отладчик является расширяемым - он фактически определяется как класс pdb.Pdb()
. В настоящее время это недокументировано, но легко понять, прочитав исходный код. Интерфейс расширения использует встроенные модули bdb
и cmd
.
Типичное использование для запуска программы под управлением отладчика:
import pdb; pdb.set_trace()
или breakpoint()
в том месте, где нужно вызвать отладчик, а затем запустить программу. Затем можно выполнить код, следующий за этим оператором, и продолжить работу без отладчика, используя команду continue
.
Изменено в версии 3.7: встроенную точку breakpoint()
, вызываемую с настройками по умолчанию, можно использовать вместо import pdb; pdb.set_trace()
.
def double(x): breakpoint() return x * 2 val = 3 print(f"{val} * 2 is {double(val)}")
Приглашение отладчика (Pdb) указывает на то, что вы находитесь в режиме отладки:
> ...(2)double() -> breakpoint() (Pdb) p x 3 (Pdb) continue 3 * 2 is 6
Модуль pdb
также может быть вызван как скрипт для отладки других скриптов.
python3 -m pdb myscript.py
При вызове в виде сценария модуль pdb
автоматически запускает post-mortem
отладку, если отлаживаемая программа завершает работу ненормально. После post-mortem
отладки или после обычного выхода из программы, модуль pdb
перезапустит программу. Автоматический перезапуск сохраняет состояние pdb
, например точки останова и в большинстве случаев более полезен, чем выход из отладчика при выходе из программы.
Типичное использование pdb.set_trace()
для взлома отладчика из запущенной программы:
import pdb class MyClass(): def __init__(self, loops): self.count = loops def start(self): for i in range(self.count): pdb.set_trace() print(i) return if __name__ == '__main__': MyClass(5).start()
Затем можно пройти по коду после pdb.set_trace()
и продолжить работу без отладчика, используя команду continue
.
Для команд и аргументов команд доступно завершение табуляции через модуль readline
, например в качестве аргументов команды p
предлагаются текущие глобальные и локальные имена.
$ python3 test.py > /home/docs-python/test.py(10)start() -> print(i) (Pdb) p MyClass <class '__main__.MyClass'> (Pdb) p MyClass.start <function MyClass.start at 0x7f623f0502f0> (Pdb) p MyClass(2).start() 0 1 None (Pdb)
Встроенная функция breakpoint()
при вызове со значениями по умолчанию может использоваться вместо import pdb; pdb.set_trace()
.
Типичное использование для выполнения инструкции под управлением отладчика:
>>> import pdb >>> def f(x): ... print(1 / x) >>> pdb.run("f(2)") # > <string>(1)<module>() # (Pdb) continue # 0.5
Типичное использование для проверки сбойной программы:
>>> import pdb >>> def f(x): ... print(1 / x) >>> f(0) # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # File "<stdin>", line 2, in f # ZeroDivisionError: division by zero >>> pdb.pm() # > <stdin>(2)f() # (Pdb) p x # 0 # (Pdb)
Изменено в Python 3.13: реализация PEP 667 означает, что назначения имен, выполненные через
pdb
, будут немедленно влиять на активную область, даже при работе внутри оптимизированной области.