pdb — Дебаггер Python
Исходный код: Lib/pdb.py
Модуль pdb определяет интерактивный отладчик исходного кода для программ Python. Он поддерживает установку (условных) точек останова и пошаговое выполнение на уровне строк исходного кода, инспекцию кадров стека, вывод исходного кода и вычисление произвольного кода Python в контексте любого кадра стека. Он также поддерживает пост-мортальную отладку и может вызываться под управлением программы.
Отладчик расширяем — он фактически определен как класс Pdb. В настоящее время это недокументировано, но легко понять, прочитав исходный код. Интерфейс расширения использует модули bdb и cmd.
См. также
-
Modulefaulthandler -
Используется для явного вывода трассировок Python при ошибках, после таймаута или при сигнале пользователя.
-
Moduletraceback -
Стандартный интерфейс для извлечения, форматирования и вывода трассировок стека программ 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), что указывает на то, что вы находитесь в режиме отладки:
> ...(3)double() -> return x * 2 (Pdb) p x 3 (Pdb) continue 3 * 2 is 6
Изменено в версии 3.3: Доступна автодополнение с помощью модуля readline для команд и аргументов команд, например, текущие глобальные и локальные имена предлагаются как аргументы команды p.
Вы также можете вызвать pdb из командной строки для отладки других скриптов. Например:
python -m pdb myscript.py
При вызове в качестве модуля, pdb автоматически перейдет в пост-мортальную отладку, если отлаживаемая программа завершится аномально. После пост-мортальной отладки (или после нормального завершения программы) pdb перезапустит программу. Автоматический перезапуск сохраняет состояние pdb (такие как точки останова) и в большинстве случаев более полезен, чем выход из отладчика при выходе программы.
Изменено в версии 3.2: Добавлен параметр -c для выполнения команд так, как будто они указаны в файле .pdbrc; см. Команды отладчика.
Изменено в версии 3.7: Добавлен параметр -m для выполнения модулей аналогичным образом, как python -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)
Модуль определяет следующие функции; каждая из них запускает отладчик немного по-разному:
-
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.
-
pdb.post_mortem(traceback=None) -
Переход в пост-мортальную отладку заданного объекта traceback. Если traceback не указан, он использует traceback текущей обрабатываемой исключительной ситуации (исключение должно обрабатываться, если используется значение по умолчанию).
-
pdb.pm() -
Переход в пост-мортальную отладку трассировки, найденной в
sys.last_traceback.
Функции 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]
По умолчанию Pdb устанавливает обработчик сигнала SIGINT (который отправляется, когда пользователь нажимает Ctrl-C в консоли) при вводе команды
continue. Это позволяет снова перейти в отладчик, нажав 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 для ввода команды help (но не he или hel, ни H , ни Help или HELP). Аргументы команд должны быть разделены пробелами (пробелами или табуляцией). Необязательные аргументы заключены в квадратные скобки ([]) в синтаксисе команды; квадратные скобки не нужно набирать. Альтернативы в синтаксисе команды разделены вертикальной чертой (|).
Ввод пустой строки повторяет последнюю введённую команду. Исключение: если последняя команда была командой list, выводятся следующие 11 строк.
Команды, которые отладчик не распознаёт, предполагаются как операторы Python и выполняются в контексте отлаживаемой программы. Операторы Python также могут быть префиксными с восклицательным знаком (!). Это мощный способ инспектировать отлаживаемую программу; даже возможно изменить переменную или вызвать функцию. При возникновении исключения в таком операторе имя исключения печатается, но состояние отладчика не изменяется.
Отладчик поддерживает псевдонимы. Псевдонимы могут иметь параметры, что позволяет определённый уровень адаптивности к контексту, который рассматривается.
Несколько команд могут быть введены в одной строке, разделённые ;;. (Один ; не используется, так как это разделитель нескольких команд в строке, которая передаётся парсеру 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] -
Без аргумента выводит список доступных команд. С аргументом команда выводит справку по этой команде.
help pdbотображает полную документацию (строку документации модуляpdb). Поскольку аргумент команда должен быть идентификатором, нужно ввестиhelp exec, чтобы получить справку по команде!.
-
w(here) -
Выводит трассировку стека, причём наиболее последняя рамка находится внизу. Стрелка (
>) указывает текущую рамку, которая определяет контекст большинства команд.
-
d(own) [count] -
Перемещает текущую рамку на количество (по умолчанию 1) уровней вниз по трассировке стека (к более новой рамке).
-
u(p) [count] -
Перемещает текущую рамку на количество (по умолчанию 1) уровней вверх по трассировке стека (к более старой рамке).
-
b(reak) [([filename:]lineno | function) [, condition]] -
С аргументом lineno, задаёт точку останова там в текущем файле. С аргументом function, задаёт точку останова в первой исполняемой инструкции внутри этой функции. Номер строки можно префиксровать именем файла и двоеточием, чтобы указать точку останова в другом файле (вероятно, ещё не загруженном). Файл ищется в
sys.path. Обратите внимание, что каждой точке останова присваивается номер, с которым ссылаются все другие команды точки останова.Если присутствует второй аргумент, это выражение, которое должно быть истинным, прежде чем точка останова будет учтена.
Без аргумента выводит список всех точек останова, включая для каждой точки останова, количество раз, когда точка останова была достигнута, текущее число игнорирования и соответствующее условие, если таковое имеется.
-
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] -
Устанавливает новое условие для точки останова, выражение, которое должно быть истинным, прежде чем точка останова будет учтена. Если условие отсутствует, любое существующее условие удаляется; то есть, точка останова делается безусловной.
-
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 -
Оценить выражение в текущем контексте и вывести его значение.
Примечание
print()также может быть использован, но это не команда отладчика — это выполняет функцию Pythonprint().
-
pp expression -
Как команда
p, за исключением того, что значение выражения красиво напечатано с помощью модуляpprint.
-
whatis expression -
Вывести тип выражения.
-
source expression -
Попытка получить исходный код выражения и отобразить его.
Добавлена в версии 3.2.
-
display [expression] -
Отобразить значение выражения, если оно изменилось, каждый раз, когда выполнение останавливается в текущем фрейме.
Без выражения, вывести все отображаемые выражения для текущего фрейма.
Примечание
Отображение оценивает выражение и сравнивает его с результатом предыдущего вычисления выражения, поэтому, когда результат изменяемый, отображение может не зафиксировать изменения.
Пример:
lst = [] breakpoint() pass lst.append(1) print(lst)
Отображение не заметит, что
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] -
Больше не отображать выражение в текущем фрейме. Без выражения, очистить все отображаемые выражения для текущего фрейма.
Добавлена в версии 3.2.
-
interact -
Запустить интерактивный интерпретатор (используя модуль
code), чья глобальная область имён содержит все имена (глобальные и локальные), найденные в текущем объёме.Добавлена в версии 3.2.
-
alias [name [command]] -
Создать псевдоним с именем name, который выполняет команду. Команда не должна быть заключена в кавычки. Заменяемые параметры могут быть указаны как
%1,%2, и так далее, а%*заменяется на все параметры. Если команда опущена, показывается текущий псевдоним для 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 -
Выполнить (однострочное) утверждение в контексте текущей функции. Восклицательный знак можно опустить, если первое слово утверждения похоже на команду отладчика, например:
(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 -
Войти в рекурсивный отладчик, который выполняет код (любое выражение или оператор, выполняемый в текущей среде).
-
retval -
Вывести возвращаемое значение последнего возврата текущей функции.
Примечания
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/pdb.html