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

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

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

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

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

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

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

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

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

Добавлено в Python 3.12.: вводятся удобные переменные

Чтобы задать временную глобальную переменную, необходимо использовать удобную переменную. Удобная переменная (convenience variable) - это переменная, имя которой начинается с $. Например, $foo = 1 устанавливает глобальную переменную $foo, которую можно использовать в сеансе отладчика. Удобные переменные удаляются, когда программа возобновляет выполнение, так что вероятность вмешательства в работу программы меньше по сравнению с использованием обычных переменных, таких как foo = 1.

Есть три предустановленные удобные переменные (добавлены в Python 3.12):

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

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

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

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

Содержание:


h(elp) [command]:

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

$ python3 test.py 
> /home/docs-python/test.py(10)start()
-> print(i)
(Pdb) h w
w(here)
        Print a stack trace, with the most recent frame at the bottom.
        An arrow indicates the "current frame", which determines the
        context of most commands.  'bt' is an alias for this command.
(Pdb) h 
Documented commands (type help <topic>):
========================================
EOF    c          d        h         list      q        rv       undisplay
a      cl         debug    help      ll        quit     s        unt      
alias  clear      disable  ignore    longlist  r        source   until    
args   commands   display  interact  n         restart  step     up       
b      condition  down     j         next      return   tbreak   w        
break  cont       enable   jump      p         retval   u        whatis   
bt     continue   exit     l         pp        run      unalias  where    

Miscellaneous help topics:
==========================
exec  pdb

(Pdb) help exec
(!) statement
        Execute the (one-line) statement in the context of the current
        stack frame.  The exclamation point can be omitted unless the
        first word of the statement resembles a debugger command.  To
        assign to a global variable you must always prefix the command
        with a 'global' command, e.g.:
        (Pdb) global list_options; list_options = ['-l']
        (Pdb)

w(here):

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

d(own) [count]:

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

u(p) [count]:

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

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

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

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

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

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

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

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

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

disable [bpnumber [bpnumber ...]]:

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

enable [bpnumber [bpnumber ...]]:

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

ignore bpnumber [count]:

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

condition bpnumber [condition]:

Устанавливает новое условие condition для точки останова bpnumber, выражение , которое должно принимать значение True, прежде чем точка останова будет соблюдена. Если условие condition отсутствует, то любое существующее условие удаляется. То есть точка останова становится безусловной.

commands [bpnumber]:

Укажите список команд для номера точки останова bpnumber. Сами команды отображаются в следующих строках. Введите строку, содержащую только конец, чтобы завершить команды.

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

Чтобы удалить все команды из точки останова, введите команды и выполните их сразу же с завершением, то есть не давайте никаких команд.

Без аргумента bpnumber команда ссылается на последнюю установленную точку останова.

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

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

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

s(tep):

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

n(ext):

Продолжает выполнение до тех пор, пока не будет достигнута следующая строка в текущей функции или она не возвратит результат.

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

unt(il) [lineno]:

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

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

r(eturn):

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

c(ont(inue)):

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

j(ump) lineno:

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

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

l(ist) [first[, last]]:

Вывести исходный код для текущего файла.

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

Если второй аргумент меньше первого, он интерпретируется как число.

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

ll | longlist:

Список всего исходного кода для текущей функции или кадра. Интересные строки помечены как для списка.

a(rgs):

Распечатать список аргументов текущей функции.

p expression:

Оценивает выражение expression в текущем контексте и выводит его значение.

Примечание: также может использоваться print(), но это не команда отладчика - она ​​выполняет функцию print() Python.

pp expression:

Как и команда p, за исключением того, что значение выражения печатается с использованием модуля pprint.

whatis expression:

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

source expression:

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

display [expression]:

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

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

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

Примеры:

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)

undisplay [expression]:

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

interact:

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

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

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

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

alias [name [command]]:

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

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

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

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

# Распечатать переменные экземпляра, 
# используется как "pi classInst"
alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])
# Напечатайте переменные экземпляра 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. Если указан аргумент, то он разделяется с помощью shlex, а результат используется как новый sys.argv. История, точки останова, действия и параметры отладчика сохраняются. Команда restart - это псевдоним run.

q(uit):

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

debug code:

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

retval:

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

exceptions [excnumber]:

Добавлено в Python 3.13.

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

При использовании pdb.pm() или pdb.post_mortem(...) с цепным исключением вместо обратной трассировки, позволяет пользователю перемещаться между цепными исключениями, используя команду exceptions для составления списка исключений и номер исключения для переключения на это исключение.

Пример:

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)