Spec-Zone.ru › Python 3.13

pdb — Отладчик Python

Исходный код: Lib/pdb.py

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

Отладчик можно расширять — фактически он определён как класс Pdb. В настоящее время он не документирован, но его устройство легко понять, прочитав исходный код. Интерфейс расширения использует модули bdb и cmd.

См. также

Module faulthandler

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

Module traceback

Стандартный интерфейс для извлечения, форматирования и вывода трассировок стека программ Python.

Обычно для входа в отладчик в программу добавляют:

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

Изменено в версии 3.3: Для команд и их аргументов доступно автодополнение по клавише Tab через модуль readline; например, текущие глобальные и локальные имена предлагаются в качестве аргументов команды p.

Вы также можете вызвать pdb из командной строки для отладки других скриптов. Например:

python -m pdb [-c command] (-m module | pyfile) [args ...]

При запуске в качестве модуля pdb автоматически переходит к отладке после сбоя, если отлаживаемая программа завершается аварийно. После отладки после сбоя (или после обычного завершения программы) pdb перезапускает программу. Автоматический перезапуск сохраняет состояние pdb (например, точки останова) и в большинстве случаев полезнее, чем выход из отладчика после завершения программы.

-c, --command <command>

Выполнять команды так, как если бы они были указаны в файле .pdbrc; см. Команды отладчика.

Изменено в версии 3.2: Добавлен параметр -c.

-m <module>

Запускать модули аналогично тому, как это делает python -m. Как и при запуске скрипта, отладчик приостановит выполнение непосредственно перед первой строкой модуля.

Изменено в версии 3.7: Добавлен параметр -m.

Обычно для выполнения инструкции под управлением отладчика используют:

>>> 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)

Изменено в версии 3.13: Реализация PEP 667 означает, что присваивание имён через pdb немедленно влияет на активную область видимости, даже при выполнении внутри оптимизированной области видимости.

Модуль определяет следующие функции; каждая из них запускает отладчик немного по-разному:

pdb.run(statement, globals=None, locals=None)

Выполняет инструкцию (заданную в виде строки или объекта кода) под управлением отладчика. Приглашение отладчика появляется до выполнения кода; можно установить точки останова и ввести команду continue либо пошагово выполнить инструкцию с помощью step или next (все эти команды описаны ниже). Необязательные аргументы globals и locals задают окружение, в котором выполняется код; по умолчанию используется словарь модуля __main__. (См. описание встроенных функций exec() или eval().)

pdb.runeval(expression, globals=None, locals=None)

Вычисляет выражение (заданное в виде строки или объекта кода) под управлением отладчика. При возврате runeval() возвращает значение выражения. В остальном эта функция аналогична run().

pdb.runcall(function, *args, **kwds)

Вызывает функцию (объект функции или метода, а не строку) с заданными аргументами. При возврате runcall() возвращает значение, возвращённое вызовом функции. Приглашение отладчика появляется сразу после входа в функцию.

pdb.set_trace(*, header=None)

Запускает отладчик в вызывающем кадре стека. Это полезно для жёсткого задания точки останова в определённом месте программы, даже если код в остальном не отлаживается (например, при сбое утверждения). Если задан аргумент header, он выводится в консоль непосредственно перед началом отладки.

Изменено в версии 3.7: Добавлен аргумент, задаваемый только по ключевому слову, header.

Изменено в версии 3.13: set_trace() запускает отладчик немедленно, а не на следующей строке кода, которая должна быть выполнена.

pdb.post_mortem(t=None)

Запускает отладку после сбоя для заданного исключения или объекта трассировки стека. Если значение не задано, используется исключение, которое обрабатывается в данный момент; если такого исключения нет, возникает ValueError.

Изменено в версии 3.13: Добавлена поддержка объектов исключений.

pdb.pm()

Запускает отладку после сбоя для исключения, найденного в sys.last_exc.

Функции run* и set_trace() являются сокращёнными способами создания экземпляра класса Pdb и вызова одноимённого метода. Чтобы получить доступ к дополнительным возможностям, нужно сделать это самостоятельно:

class pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False, readrc=True)

Pdb — это класс отладчика.

Аргументы completekey, stdin и stdout передаются базовому классу cmd.Cmd; см. его описание.

Если аргумент skip задан, он должен быть итерируемым объектом с шаблонами имён модулей в стиле glob. Отладчик не будет заходить в кадры, исходящие из модуля, соответствующего одному из этих шаблонов. [1]

По умолчанию при передаче команды continue Pdb устанавливает обработчик сигнала SIGINT (который отправляется при нажатии Ctrl-C в консоли). Это позволяет снова перейти в отладчик, нажав Ctrl-C. Чтобы Pdb не менял обработчик SIGINT, задайте для nosigint значение true.

Аргумент readrc по умолчанию имеет значение true и определяет, будет ли Pdb загружать файлы .pdbrc из файловой системы.

Пример вызова для включения трассировки с параметром skip:

import pdb; pdb.Pdb(skip=['django.*']).set_trace()

Вызывает событие аудита pdb.Pdb без аргументов.

Изменено в версии 3.1: Добавлен параметр skip.

Изменено в версии 3.2: Добавлен параметр nosigint. Ранее Pdb никогда не устанавливал обработчик SIGINT.

Изменено в версии 3.6: Добавлен аргумент readrc.

run(statement, globals=None, locals=None)
runeval(expression, globals=None, locals=None)
runcall(function, *args, **kwds)
set_trace()

См. документацию к описанным выше функциям.

Команды отладчика

Ниже перечислены команды, распознаваемые отладчиком. Большинство команд можно сокращать до одной или двух букв, как указано; например, h(elp) означает, что для вызова команды справки можно использовать h или help (но не he или hel и не H, Help или HELP). Аргументы команд должны разделяться пробельными символами (пробелами или табуляцией). Необязательные аргументы заключаются в квадратные скобки ([]) в синтаксисе команды; вводить квадратные скобки не нужно. Альтернативы в синтаксисе команды разделяются вертикальной чертой (|).

Пустая строка повторяет последнюю введённую команду. Исключение: если последней командой была команда list, выводятся следующие 11 строк.

Команды, которые отладчик не распознаёт, считаются инструкциями Python и выполняются в контексте отлаживаемой программы. Перед инструкциями Python также можно поставить восклицательный знак (!). Это эффективный способ исследовать отлаживаемую программу; можно даже изменить переменную или вызвать функцию. Если при выполнении такой инструкции возникает исключение, выводится его имя, но состояние отладчика не меняется.

Изменено в версии 3.13: Выражения/инструкции, начинающиеся с префикса команды pdb, теперь правильно распознаются и выполняются.

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

В одной строке можно ввести несколько команд, разделив их символом ;;. (Один символ ; не используется, так как он служит разделителем нескольких команд в строке, передаваемой анализатору Python.) Команды разделяются без учёта контекста; ввод разбивается по первой паре ;;, даже если она находится внутри строки в кавычках. Для строк с двойными точками с запятой можно использовать неявную конкатенацию строк ';'';' или ";"";".

Чтобы задать временную глобальную переменную, используйте переменную удобства. Переменная удобства — это переменная, имя которой начинается с $. Например, $foo = 1 задаёт глобальную переменную $foo, которую можно использовать в сеансе отладки. Переменные удобства очищаются при возобновлении выполнения программы, поэтому их использование с меньшей вероятностью помешает работе программы, чем использование обычных переменных, таких как foo = 1.

Предусмотрены три переменные удобства:

  • $_frame: текущий отлаживаемый кадр стека
  • $_retval: возвращаемое значение, если функция в кадре завершается
  • $_exception: исключение, если в кадре возникает исключение

Добавлено в версии 3.12: Добавлена возможность использовать переменные удобства.

Если файл .pdbrc существует в домашнем каталоге пользователя или в текущем каталоге, он считывается с кодировкой 'utf-8' и выполняется так, как если бы его ввели в приглашении отладчика, за исключением того, что пустые строки и строки, начинающиеся с #, игнорируются. Это особенно полезно для псевдонимов. Если существуют оба файла, сначала считывается файл из домашнего каталога, а определённые в нём псевдонимы можно переопределить в локальном файле.

Изменено в версии 3.2: .pdbrc теперь может содержать команды, продолжающие отладку, например continue или next. Ранее эти команды не действовали.

Изменено в версии 3.11: .pdbrc теперь считывается с кодировкой 'utf-8'. Ранее использовалась кодировка системной локали.

h(elp) [command]

Без аргументов выводит список доступных команд. Если указан аргумент command, выводит справку по этой команде. help pdb отображает полную документацию (строку документации модуля pdb). Поскольку аргумент command должен быть идентификатором, для получения справки по команде ! нужно ввести help exec.

w(here)

Выводит трассировку стека, начиная с самого недавнего кадра внизу. Стрелка (>) указывает на текущий кадр, который определяет контекст большинства команд.

d(own) [count]

Перемещает текущий кадр на count уровней вниз по трассировке стека (к более новому кадру); по умолчанию — на один уровень.

u(p) [count]

Перемещает текущий кадр на count уровней вверх по трассировке стека (к более старому кадру); по умолчанию — на один уровень.

b(reak) [([filename:]lineno | function) [, condition]]

Если указан аргумент lineno, устанавливает точку останова на строке lineno в текущем файле. Перед номером строки можно указать filename и двоеточие, чтобы задать точку останова в другом файле (возможно, ещё не загруженном). Поиск файла выполняется в sys.path. Допустимые формы аргумента filename: /abspath/to/file.py, relpath/file.py, module и package.module.

Если указан аргумент function, устанавливает точку останова на первой исполняемой инструкции этой функции. function может быть любым выражением, которое вычисляется в функцию в текущем пространстве имён.

Если указан второй аргумент, это выражение, которое должно вычислиться в истинное значение, чтобы сработала точка останова.

Без аргументов выводит список всех точек останова, а также количество срабатываний каждой из них, текущее значение счётчика игнорирования и связанное условие, если оно задано.

Каждой точке останова присваивается номер, на который ссылаются все остальные команды для работы с точками останова.

tbreak [([filename:]lineno | function) [, condition]]

Временная точка останова, которая автоматически удаляется при первом срабатывании. Аргументы те же, что и у команды break.

cl(ear) [filename:lineno | bpnumber ...]

Если указан аргумент filename:lineno, удаляет все точки останова на этой строке. Если указан список номеров точек останова, разделённых пробелами, удаляет эти точки останова. Без аргументов удаляет все точки останова (предварительно запрашивая подтверждение).

disable bpnumber [bpnumber ...]

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

enable bpnumber [bpnumber ...]

Включает указанные точки останова.

ignore bpnumber [count]

Задаёт счётчик игнорирования для указанного номера точки останова. Если count не указан, счётчик игнорирования устанавливается в 0. Точка останова становится активной, когда счётчик игнорирования равен нулю. Если счётчик не равен нулю, значение count уменьшается при каждом достижении точки останова, если она не отключена и связанное с ней условие вычисляется в истинное значение.

condition bpnumber [condition]

Задаёт новое condition для точки останова — выражение, которое должно вычислиться в истинное значение, чтобы точка останова сработала. Если condition не указан, существующее условие удаляется, то есть точка останова становится безусловной.

commands [bpnumber]

Задаёт список команд для точки останова с номером bpnumber. Сами команды вводятся в следующих строках. Чтобы завершить ввод команд, введите строку, содержащую только end. Пример:

(Pdb) commands 1
(com) p some_variable
(com) end
(Pdb)

Чтобы удалить все команды точки останова, введите commands, а сразу после него — end; то есть не вводите никаких команд.

Если аргумент bpnumber не указан, commands относится к последней установленной точке останова.

С помощью команд точки останова можно возобновить выполнение программы. Для этого используйте команду continue, step или любую другую команду, возобновляющую выполнение.

Указание любой команды, возобновляющей выполнение (в настоящее время это continue, step, next, return, jump, quit и их сокращения) завершает список команд, как если бы сразу после этой команды стоял маркер конца. Это необходимо, поскольку при каждом возобновлении выполнения (даже простой командой next или step) может встретиться другая точка останова, у которой может быть собственный список команд, что создаёт неоднозначность относительно того, какой список выполнять.

Если в списке команд используется команда silent, обычное сообщение об остановке на точке останова не выводится. Это может быть удобно для точек останова, которые должны вывести определённое сообщение, а затем продолжить выполнение. Если другие команды ничего не выводят, вы не увидите никаких признаков срабатывания точки останова.

s(tep)

Выполняет текущую строку и останавливается при первой возможности (либо внутри вызванной функции, либо на следующей строке текущей функции).

n(ext)

Продолжает выполнение до следующей строки текущей функции или до её возврата. (Разница между next и step в том, что step останавливается внутри вызванной функции, а next выполняет вызванные функции почти на полной скорости и останавливается только на следующей строке текущей функции.)

unt(il) [lineno]

Без аргументов продолжает выполнение до достижения строки с номером больше текущего.

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

Изменено в версии 3.2: Добавлена возможность указывать номер строки явно.

r(eturn)

Продолжает выполнение до возврата из текущей функции.

c(ont(inue))

Продолжает выполнение и останавливается только при достижении точки останова.

j(ump) lineno

Задаёт следующую строку, которая будет выполнена. Доступно только в самом нижнем кадре стека. Это позволяет вернуться назад и выполнить код повторно или перейти вперёд, пропустив ненужный код.

Следует учитывать, что разрешены не все переходы — например, нельзя перейти в середину цикла for или выйти из блока finally.

l(ist) [first[, last]]

Выводит исходный код текущего файла. Без аргументов выводит 11 строк вокруг текущей строки или продолжает предыдущий вывод. Если в качестве аргумента указано ., выводит 11 строк вокруг текущей строки. С одним аргументом выводит 11 строк вокруг указанной строки. С двумя аргументами выводит указанный диапазон; если второй аргумент меньше первого, он интерпретируется как количество строк.

Текущая строка текущего кадра отмечается символом ->. Если выполняется отладка исключения, строка, в которой исключение первоначально возникло или было передано дальше, отмечается символом >>, если она отличается от текущей строки.

Изменено в версии 3.2: Добавлен маркер >>.

ll | longlist

Выводит весь исходный код текущей функции или кадра. Важные строки отмечаются так же, как в команде list.

Добавлено в версии 3.2.

a(rgs)

Выводит аргументы текущей функции и их текущие значения.

p expression

Вычисляет expression в текущем контексте и выводит его значение.

Примечание

Можно также использовать print(), но это не команда отладчика — она вызывает функцию Python print().

pp expression

Аналогична команде p, но значение expression выводится в удобном для чтения виде с помощью модуля pprint.

whatis expression

Выводит тип expression.

source expression

Пытается получить исходный код expression и вывести его.

Добавлено в версии 3.2.

display [expression]

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

Без аргумента expression выводит список всех выражений для отображения в текущем кадре.

Примечание

Команда display вычисляет expression и сравнивает его с результатом предыдущего вычисления expression, поэтому при изменяемом результате команда display может не обнаружить изменения.

Пример:

lst = []
breakpoint()
pass
lst.append(1)
print(lst)

Команда display не обнаружит изменение lst, поскольку результат вычисления изменяется на месте с помощью lst.append(1) до сравнения:

> example.py(3)<module>()
-> pass
(Pdb) display lst
display lst: []
(Pdb) n
> example.py(4)<module>()
-> lst.append(1)
(Pdb) n
> example.py(5)<module>()
-> print(lst)
(Pdb)

Чтобы это исправить, можно воспользоваться механизмом копирования:

> example.py(3)<module>()
-> pass
(Pdb) display lst[:]
display lst[:]: []
(Pdb) n
> example.py(4)<module>()
-> lst.append(1)
(Pdb) n
> example.py(5)<module>()
-> print(lst)
display lst[:]: [1]  [old: []]
(Pdb)

Добавлено в версии 3.2.

undisplay [expression]

Прекращает отображать expression в текущем кадре. Без аргумента expression удаляет все выражения для отображения в текущем кадре.

Добавлено в версии 3.2.

interact

Запускает интерактивный интерпретатор (с помощью модуля code) в новом глобальном пространстве имён, инициализированном локальным и глобальным пространствами имён текущей области видимости. Используйте exit() или quit(), чтобы выйти из интерпретатора и вернуться к отладчику.

Примечание

Поскольку interact создаёт новое отдельное пространство имён для выполнения кода, присваивание переменным не влияет на исходные пространства имён. Однако изменения любых изменяемых объектов, на которые есть ссылки, как обычно, отражаются в исходных пространствах имён.

Добавлено в версии 3.2.

Изменено в версии 3.13: Для выхода из команды interact можно использовать exit() и quit().

Изменено в версии 3.13: Вывод команды interact теперь направляется в канал вывода отладчика, а не в sys.stderr.

alias [name [command]]

Создаёт псевдоним с именем name, выполняющий команду command. Команду command не нужно заключать в кавычки. Заменяемые параметры можно обозначить с помощью %1, %2, … и %9, а %* заменяется всеми параметрами. Если command не указан, отображается текущий псевдоним для name. Если аргументы не указаны, выводится список всех псевдонимов.

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

Например, вот два полезных псевдонима (особенно если добавить их в файл .pdbrc):

# Print instance variables (usage "pi classInst")
alias pi for k in %1.__dict__.keys(): print(f"%1.{k} = {%1.__dict__[k]}")
# Print instance variables in self
alias ps pi self
unalias name

Удаляет указанный псевдоним name.

! statement

Выполняет (однострочную) statement в контексте текущего кадра стека. Восклицательный знак можно опустить, если только первое слово инструкции не похоже на команду отладчика. Например:

(Pdb) ! n=42
(Pdb)

Чтобы задать глобальную переменную, можно предварить команду присваивания инструкцией global в той же строке, например:

(Pdb) global list_options; list_options = ['-l']
(Pdb)
run [args ...]
restart [args ...]

Перезапускает отлаживаемую программу Python. Если указан аргумент args, он разбивается с помощью shlex, а результат используется как новое значение sys.argv. История, точки останова, действия и параметры отладчика сохраняются. restart — это псевдоним команды run.

q(uit)

Завершает работу отладчика. Выполняемая программа прерывается.

debug code

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

retval

Выводит значение, возвращённое при последнем выходе из текущей функции.

exceptions [excnumber]

Выводит список связанных исключений или позволяет переключаться между ними.

Если вместо трассировки стека использовать pdb.pm() или Pdb.post_mortem(...) для связанного исключения, пользователь сможет перемещаться между связанными исключениями: команда exceptions выводит список исключений, а exceptions <number> переключает на выбранное исключение.

Пример:

def out():
    try:
        middle()
    except Exception as e:
        raise ValueError("reraise middle() error") from e

def middle():
    try:
        return inner(0)
    except Exception as e:
        raise ValueError("Middle fail")

def inner(x):
    1 / x

 out()

Вызов pdb.pm() позволит переключаться между исключениями:

> example.py(5)out()
-> raise ValueError("reraise middle() error") from e

(Pdb) exceptions
  0 ZeroDivisionError('division by zero')
  1 ValueError('Middle fail')
> 2 ValueError('reraise middle() error')

(Pdb) exceptions 0
> example.py(16)inner()
-> 1 / x

(Pdb) up
> example.py(10)middle()
-> return inner(0)

Добавлено в версии 3.13.

Сноски

[1]

Определение того, относится ли кадр к определённому модулю, зависит от значения __name__ в глобальных переменных кадра.

© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/pdb.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API