Сообщить об ошибке.

Модуль pdb, отладчик Python

Отладчик программ, написанных на Python

Модуль 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, будут немедленно влиять на активную область, даже при работе внутри оптимизированной области.