pdb — Отладчик Python

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


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

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

Приглашение отладчика (Pdb). Типичное использование для запуска программы под управлением отладчика::

>>> import pdb
>>> import mymodule
>>> pdb.run('mymodule.test()')
> <string>(0)?()
(Pdb) continue
> <string>(1)?()
(Pdb) continue
NameError: 'spam'
> <string>(1)?()
(Pdb)

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

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

python3 -m pdb myscript.py

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

Добавлено в версии 3.2: pdb.py теперь принимает параметр -c, который выполняет команды, как если бы они были заданы в файле .pdbrc, см. раздел Команды отладчика.

Добавлено в версии 3.7: Теперь pdb.py принимает опцию -m, которая выполняет модули аналогично тому, как это делает python3 -m. Как и в случае со сценарием, отладчик приостановит выполнение непосредственно перед первой строкой модуля.

Типичное использование для прерывания отладчика из запущенной программы - вставка:

import pdb; pdb.set_trace()

в том месте, где вы хотите прервать отладчик. Вы можете тогда ступить через код после этого инструкция и продолжить бежать без отладчика, используя команду continue.

Добавлено в версии 3.7: Встроенный breakpoint(), когда его называют с дефолтами, может быть используемый вместо import pdb; pdb.set_trace().

Типичное использование для проверки поврежденной программы::

>>> import pdb
>>> import mymodule
>>> mymodule.test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "./mymodule.py", line 4, in test
    test2()
  File "./mymodule.py", line 3, in test2
    print(spam)
NameError: spam
>>> pdb.pm()
> ./mymodule.py(3)test2()
-> print(spam)
(Pdb)

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

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

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

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

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

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

Вызовите function (функцию или объект метода, а не строка) с заданными аргументами. Когда runcall() возвращает, это возвращает то, что функция называет возвращенный. Запрос отладчика появляется сразу после ввода функции.

pdb.set_trace(*, header=None)

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

Изменено в версии 3.7: Только ключевой аргумент header.

pdb.post_mortem(traceback=None)

Введите посмертную отладку данного объекта 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-style. Отладчик не будет переходить к кадрам, созданным в модуле, соответствующем одному из этих шаблонов. [1]

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

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

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

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

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

Добавлено в версии 3.1: Аргумент skip.

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

Изменено в версии 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 инструкции также может иметь префикс восклицательного знака (!). Это мощный способ проверки отлаживаемой программы; можно даже изменить переменную или вызвать функцию. Когда в такой инструкция возникает исключение, имя исключения печатается, но состояние отладчика не изменяется.

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

Несколько команд могут быть введены в одной строке, разделенной ;;. (Единственный ; не используемый, как это - сепаратор для нескольких команд в линии, которая передана к Python парсер.) для разделения команд не применяется интеллект; вход разделен в первой паре ;;, даже если это посреди указанной строки.

Если файл .pdbrc существует в домашнем каталоге пользователя или в текущем каталоге, он считывается и выполняется, как если бы он был введен в ответ на запрос отладчика. Это особенно полезно для псевдонимов. При наличии обоих файлов сначала считывается файл в домашнем каталоге, а определенные псевдонимы могут быть переопределены файлом локальная.

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

h (elp) [команда]

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

w (здесь)

Печать трассировки стека с самыми последними фрейм внизу. Стрелка указывает текущую фрейм, которая определяет контекст большинства команд.

d (own) [count]

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

u (p) [count]

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

b (reak) [([имя файла:] lineno | функция) [, условие]]

С помощью аргумента lineno установите разрыв в текущем файле. С аргументом function, набор разрыв в первом выполнимом инструкция в той функции. Номер строки может иметь префикс с именем файла и двоеточием для указания точки останова в другом файле (возможно, еще не загруженном). Файл - найденный на sys.path. Следует отметить, что каждой точке останова присваивается номер, на который ссылаются все остальные команды точки останова.

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

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

tbreak [([имя файла:] lineno | функция) [, условие]]

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

cl (ear) [имя файла: lineno | bpnumber [bpnumber...]]

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

disable [bpnumber [bpnumber...]]

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

enable [bpnumber [bpnumber...]]

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

ignore bpnumber [count]

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

condition bpnumber [condition]

Установить new condition для точки останова, выражение, которое должно вычислять значение true перед тем, как точка останова будет обработана. Если 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 и их сокращения) заканчивает список команды (как будто та команда немедленно сопровождалась к концу). Это связано с тем, что при каждом возобновлении выполнения (даже при простом следующем или шаге) может возникнуть другая точка останова, которая может иметь свой собственный список команд, что приведет к двусмысленностям относительно того, какой список выполнять.

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

s(tep)

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

n(ext)

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

unt(il) [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, кроме значение выражения довольно напечатан, используя модуль pprint.

whatis expression

Печать типа expression.

source expression

Попытайтесь получить источник код для данного объекта и показать его.

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

display [expression]

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

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

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

undisplay [expression]

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

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

interact

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

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

alias [name [command]]

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

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

В качестве примера можно привести два полезных псевдонима (особенно при размещении в файле .pdbrc):

# Распечатать переменную экземпляра (использование "pi classInst")
alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])
# Напечатать переменные экземпляра в self
alias ps pi self
unalias name

Удаление указанного алиаса.

! statement

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

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

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

q(uit)

Выход из отладчика. Выполняемая программа прерывается.

debug code

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

retval

Печать возвращаемого значения для последнего возвращения функции.

Сноски

[1]Считается ли фрейм источником в определенном модуле, определяется __name__ в фрейме глобалов (globals).