Документация Python неофициальный перевод

pdb.md

619 строк · 48.4 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.16/library/pdb.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `pdb` – Отладчик Python89**Исходный код:** [Lib/pdb.py](https://python-all.ru/src/main/Lib/pdb.py)1011---1213Модуль `pdb` определяет интерактивный отладчик исходного кода для программ на Python. Он поддерживает установку (условных) точек останова и пошаговое исполнение на уровне строк исходного кода, просмотр стековых фреймов, отображение исходного кода и выполнение произвольного кода Python в контексте любого фрейма. Также поддерживается посмертная отладка, и его можно вызывать программно.1415Отладчик расширяем – на самом деле он определён как класс [`Pdb`](https://python-all.ru/3.16/library/pdb.html#pdb.Pdb). В настоящее время это не документировано, но легко понять из исходного кода. Интерфейс расширения использует модули [`bdb`](https://python-all.ru/3.16/library/bdb.html#module-bdb) и [`cmd`](https://python-all.ru/3.16/library/cmd.html#module-cmd).1617> **См. также**18>19> **Модуль [`faulthandler`](https://python-all.ru/3.16/library/faulthandler.html#module-faulthandler)**20>21> Используется для явного вывода трассировок Python при сбое, по тайм-ауту или по сигналу пользователя.22>23> **Модуль [`traceback`](https://python-all.ru/3.16/library/traceback.html#module-traceback)**24>25> Стандартный интерфейс для извлечения, форматирования и вывода трассировок стека программ на Python.2627Типичное использование для входа в отладчик – вставить:2829```python30import pdb; pdb.set_trace()31```3233Или:3435```python36breakpoint()37```3839в место, где нужно войти в отладчик, а затем запустить программу. После этого можно пошагово выполнять код, следующий за этой инструкцией, и продолжить выполнение без отладчика с помощью команды [`continue`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-continue).4041Изменено в версии 3.7: Встроенную функцию [`breakpoint()`](https://python-all.ru/3.16/library/functions.html#breakpoint) при вызове по умолчанию можно использовать вместо `import pdb; pdb.set_trace()`.4243```python44def double(x):45   breakpoint()46   return x * 247val = 348print(f"{val} * 2 is {double(val)}")49```5051Приглашение отладчика – `(Pdb)`, что указывает на то, что вы находитесь в режиме отладки:5253```python54> ...(2)double()55-> breakpoint()56(Pdb) p x57358(Pdb) continue593 * 2 is 660```6162Изменено в версии 3.3: Автодополнение по табуляции через модуль [`readline`](https://python-all.ru/3.16/library/readline.html#module-readline) доступно для команд и их аргументов; например, текущие глобальные и локальные имена предлагаются как аргументы команды `p`.6364## Интерфейс командной строки6566Также можно вызвать `pdb` из командной строки для отладки других скриптов. Например:6768```python69python -m pdb [-c command] (-m module | -p pid | pyfile) [args ...]70```7172При запуске как модуля pdb автоматически переходит в режим посмертной отладки, если отлаживаемая программа завершается аварийно. После посмертной отладки (или после нормального завершения программы) pdb перезапускает программу. Автоматический перезапуск сохраняет состояние pdb (например, точки останова) и в большинстве случаев полезнее, чем выход из отладчика при завершении программы.7374#### `-c, --command <command>`7576Для выполнения команд, как если бы они были заданы в файле `.pdbrc`; см. [Команды отладчика](https://python-all.ru/3.16/library/pdb.html#debugger-commands).7778Изменено в версии 3.2: Добавлена опция `-c`.7980#### `-m <module>`8182Для выполнения модулей аналогично тому, как это делает `python -m`. Как и в случае со скриптом, отладчик приостановит выполнение прямо перед первой строкой модуля.8384Изменено в версии 3.7: Добавлена опция `-m`.8586#### `-p, --pid <pid>`8788Присоединиться к процессу с указанным PID.8990Добавлено в версии 3.14.9192Чтобы присоединиться к работающему процессу Python для удалённой отладки, используйте опцию `-p` или `--pid` с PID целевого процесса:9394```python95python -m pdb -p 123496```9798> **Примечание**99>100> Присоединение к процессу, заблокированному в системном вызове или ожидающему ввода-вывода, сработает только после выполнения следующей инструкции байт-кода или когда процесс получит сигнал.101102Типичное использование для выполнения инструкции под управлением отладчика:103104```python105>>> import pdb106>>> def f(x):107...     print(1 / x)108>>> pdb.run("f(2)")109> <string>(1)<module>()110(Pdb) continue1110.5112>>>113```114115Типичное использование для анализа аварийно завершившейся программы:116117```python118>>> import pdb119>>> def f(x):120...     print(1 / x)121...122>>> f(0)123Traceback (most recent call last):124  File "<stdin>", line 1, in <module>125  File "<stdin>", line 2, in f126ZeroDivisionError: division by zero127>>> pdb.pm()128> <stdin>(2)f()129(Pdb) p x1300131(Pdb)132```133134Изменено в версии 3.13: Реализация [**PEP 667**](https://python-all.ru/3.16/library/pdb.html) означает, что присваивания имён через `pdb` немедленно влияют на активную область видимости, даже при выполнении внутри [оптимизированной области](https://python-all.ru/3.16/glossary.html#term-optimized-scope).135136Модуль определяет следующие функции; каждая из них запускает отладчик немного по-своему:137138#### `pdb.run(statement, globals=None, locals=None)`139140Выполняет *инструкцию* (заданную как строку или объект кода) под управлением отладчика. Приглашение отладчика появляется до выполнения любого кода; можно установить точки останова и ввести [`continue`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-continue), или пошагово пройти инструкцию с помощью [`step`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-step) или [`next`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-next) (все эти команды описаны ниже). Необязательные аргументы *globals* и *locals* задают окружение, в котором выполняется код; по умолчанию используется словарь модуля [`__main__`](https://python-all.ru/3.16/library/__main__.html#module-__main__). (См. описание встроенных функций [`exec()`](https://python-all.ru/3.16/library/functions.html#exec) или [`eval()`](https://python-all.ru/3.16/library/functions.html#eval).)141142#### `pdb.runeval(expression, globals=None, locals=None)`143144Вычисляет *выражение* (заданное как строка или объект кода) под управлением отладчика. Когда `runeval()` возвращает результат, он возвращает значение *выражения*. В остальном эта функция аналогична [`run()`](https://python-all.ru/3.16/library/pdb.html#pdb.run).145146#### `pdb.runcall(function, *args, **kwds)`147148Вызывает *функцию* (объект функции или метода, а не строку) с заданными аргументами. Когда `runcall()` возвращает управление, возвращается результат вызова функции. Приглашение отладчика появляется сразу после входа в функцию.149150#### `pdb.set_trace(*, header=None, commands=None)`151152Выполняет вход в отладчик в стековом фрейме вызова. Это полезно для жёсткого задания точки останова в определённом месте программы, даже если код в остальном не отлаживается (например, при неудачной проверке утверждения). Если задан, *header* выводится на консоль непосредственно перед началом отладки. Аргумент *commands*, если задан, представляет собой список команд для выполнения при запуске отладчика.153154Изменено в версии 3.7: Добавлен именованный аргумент *header*.155156Изменено в версии 3.13: `set_trace()` теперь войдёт в отладчик немедленно, а не на следующей исполняемой строке кода.157158Добавлено в версии 3.14: Аргумент *commands*.159160#### `awaitable pdb.set_trace_async(*, header=None, commands=None)`161162Асинхронная версия [`set_trace()`](https://python-all.ru/3.16/library/pdb.html#pdb.set_trace). Эту функцию следует использовать внутри асинхронной функции с [`await`](https://python-all.ru/3.16/reference/expressions.html#await).163164```python165async def f():166    await pdb.set_trace_async()167```168169Операторы [`await`](https://python-all.ru/3.16/reference/expressions.html#await) поддерживаются, если отладчик вызван этой функцией.170171Добавлено в версии 3.14.172173#### `pdb.post_mortem(t=None)`174175Вход в посмертную отладку (post-mortem) для заданного исключения или [объекта трассировки](https://python-all.ru/3.16/reference/datamodel.html#traceback-objects). Если значение не задано, используется исключение, обрабатываемое в данный момент, или возбуждается `ValueError`, если такового нет.176177Изменено в версии 3.13: Добавлена поддержка объектов исключений.178179#### `pdb.pm()`180181Вход в посмертную отладку исключения, найденного в [`sys.last_exc`](https://python-all.ru/3.16/library/sys.html#sys.last_exc).182183#### `pdb.set_default_backend(backend)`184185Для pdb поддерживаются два бэкенда: `'settrace'` и `'monitoring'`. Подробнее см. [`bdb.Bdb`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb). Пользователь может установить бэкенд по умолчанию, если ни один не указан при создании [`Pdb`](https://python-all.ru/3.16/library/pdb.html#pdb.Pdb). Если бэкенд не указан, по умолчанию используется `'settrace'`.186187> **Примечание**188>189> [`breakpoint()`](https://python-all.ru/3.16/library/functions.html#breakpoint) и [`set_trace()`](https://python-all.ru/3.16/library/pdb.html#pdb.set_trace) не будут затронуты этой функцией. Они всегда используют бэкенд `'monitoring'`.190191Добавлено в версии 3.14.192193#### `pdb.get_default_backend()`194195Возвращает бэкенд по умолчанию для pdb.196197Добавлено в версии 3.14.198199Функции `run*` и [`set_trace()`](https://python-all.ru/3.16/library/pdb.html#pdb.set_trace) являются псевдонимами для создания экземпляра класса [`Pdb`](https://python-all.ru/3.16/library/pdb.html#pdb.Pdb) и вызова одноимённого метода. Если требуется доступ к дополнительным возможностям, это нужно сделать самостоятельно:200201#### `class pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False, readrc=True, mode=None, backend=None, colorize=False)`202203`Pdb` – это класс отладчика.204205Аргументы *completekey*, *stdin* и *stdout* передаются базовому классу [`cmd.Cmd`](https://python-all.ru/3.16/library/cmd.html#cmd.Cmd); см. описание там.206207Аргумент *skip*, если задан, должен быть итерабельным с шаблонами имён модулей в стиле glob. Отладчик не будет входить в фреймы, происходящие из модуля, который соответствует одному из этих шаблонов. [\[1\]](https://python-all.ru/3.16/library/pdb.html#id3)208209По умолчанию Pdb устанавливает обработчик сигнала SIGINT (который посылается при нажатии пользователем `Ctrl`-`C` на консоли) при вводе команды [`continue`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-continue). Это позволяет снова войти в отладчик, нажав `Ctrl`-`C`. Если требуется, чтобы Pdb не изменял обработчик SIGINT, установите *nosigint* в значение true.210211Аргумент *readrc* по умолчанию равен true и определяет, будет ли Pdb загружать файлы .pdbrc из файловой системы.212213Аргумент *mode* указывает, как был вызван отладчик. Это влияет на работу некоторых команд отладчика. Допустимые значения: `'inline'` (используется встроенной функцией breakpoint()), `'cli'` (используется при вызове из командной строки) или `None` (для обратно совместимого поведения, как до добавления аргумента *mode*).214215Аргумент *backend* определяет бэкенд для отладчика. Если передан `None`, будет использован бэкенд по умолчанию. См. [`set_default_backend()`](https://python-all.ru/3.16/library/pdb.html#pdb.set_default_backend). В противном случае поддерживаемые бэкенды – `'settrace'` и `'monitoring'`.216217Аргумент *colorize*, если установлен в `True`, включает цветной вывод в отладчике, если цвет поддерживается. Это подсветит исходный код, отображаемый в pdb.218219Пример вызова для включения трассировки с *skip*:220221```python222import pdb; pdb.Pdb(skip=['django.*']).set_trace()223```224225Возбуждает [событие аудита](https://python-all.ru/3.16/library/sys.html#auditing) `pdb.Pdb` без аргументов.226227Изменено в версии 3.1: Добавлен параметр *skip*.228229Изменено в версии 3.2: Добавлен параметр *nosigint*. Ранее обработчик SIGINT никогда не устанавливался Pdb.230231Изменено в версии 3.6: Добавлен аргумент *readrc*.232233Добавлено в версии 3.14: Добавлен аргумент *mode*.234235Добавлено в версии 3.14: Добавлен аргумент *backend*.236237Добавлено в версии 3.14: Добавлен аргумент *colorize*.238239Изменено в версии 3.14: Встроенные точки останова, такие как [`breakpoint()`](https://python-all.ru/3.16/library/functions.html#breakpoint) или [`pdb.set_trace()`](https://python-all.ru/3.16/library/pdb.html#pdb.set_trace), всегда останавливают программу в вызывающем фрейме, игнорируя шаблон *skip* (если он задан).240241#### `run(statement, globals=None, locals=None)`242243#### `runeval(expression, globals=None, locals=None)`244245#### `runcall(function, *args, **kwds)`246247#### `set_trace()`248249См. документацию по функциям, описанным выше.250251## Команды отладчика252253Команды, распознаваемые отладчиком, перечислены ниже. Большинство команд можно сократить до одной или двух букв, как указано; например, `h(elp)` означает, что для ввода команды help можно использовать `h` или `help` (но не `he` или `hel`, а также не `H` или `Help` или `HELP`). Аргументы команд должны разделяться пробельными символами (пробелами или табуляцией). Необязательные аргументы заключаются в квадратные скобки (`[]`) в синтаксисе команды; сами скобки вводить не нужно. Альтернативы в синтаксисе команды разделяются вертикальной чертой (`|`).254255Ввод пустой строки повторяет последнюю введённую команду. Исключение: если последней командой была [`list`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-list), то будут выведены следующие 11 строк.256257Команды, которые отладчик не распознает, считаются операторами Python и выполняются в контексте отлаживаемой программы. Операторы Python также можно начинать с восклицательного знака (`!`). Это мощный способ исследовать отлаживаемую программу; можно даже изменить переменную или вызвать функцию. Если в таком операторе возникает исключение, выводится его имя, но состояние отладчика не меняется.258259Изменено в версии 3.13: Выражения/операторы, начинающиеся с команды pdb, теперь корректно распознаются и выполняются.260261Отладчик поддерживает [псевдонимы](https://python-all.ru/3.16/library/pdb.html#debugger-aliases). Псевдонимы могут иметь параметры, что обеспечивает некоторую гибкость в зависимости от контекста.262263Несколько команд можно вводить в одной строке, разделяя их `;;`. (Одиночный `;` не используется, поскольку именно он является разделителем для нескольких команд в строке, передаваемой синтаксическому анализатору Python.) При разделении команд не применяется никакой интеллектуальный анализ; ввод разбивается по первой паре `;;`, даже если она находится внутри строки в кавычках. Обходной путь для строк с двойными точками с запятой – использовать неявную конкатенацию строк `';'';'` или `";"";"`.264265Чтобы установить временную глобальную переменную, используйте *удобную переменную* (convenience variable). *Удобная переменная* – это переменная, имя которой начинается с `$`. Например, `$foo = 1` устанавливает глобальную переменную `$foo`, которую можно использовать в сеансе отладчика. *Удобные переменные* очищаются при возобновлении выполнения программы, поэтому они с меньшей вероятностью повлияют на вашу программу по сравнению с обычными переменными, такими как `foo = 1`.266267Существует четыре предустановленных *удобных переменных*:268269- `$_frame`: текущий отлаживаемый фрейм270- `$_retval`: возвращаемое значение, если фрейм завершается возвратом271- `$_exception`: исключение, если фрейм выбрасывает исключение272- `$_asynctask`: задача asyncio, если pdb останавливается в асинхронной функции273274Добавлено в версии 3.12: Добавлена возможность *удобных переменных*.275276Добавлено в версии 3.14: Добавлена удобная переменная `$_asynctask`.277278Если файл `.pdbrc` существует в домашнем каталоге пользователя или в текущем каталоге, он читается в кодировке `'utf-8'` и выполняется так, как если бы он был введён в приглашении отладчика, за исключением того, что пустые строки и строки, начинающиеся с `#`, игнорируются. Это особенно полезно для псевдонимов. Если оба файла существуют, сначала читается файл в домашнем каталоге, и определённые в нём псевдонимы могут быть переопределены локальным файлом.279280Изменено в версии 3.2: `.pdbrc` теперь может содержать команды, продолжающие отладку, например [`continue`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-continue) или [`next`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-next). Ранее эти команды не действовали.281282Изменено в версии 3.11: `.pdbrc` теперь читается в кодировке `'utf-8'`. Ранее он читался в кодировке системной локали.283284#### `h(elp) [command]`285286Без аргументов выводит список доступных команд. С аргументом *команда* выводит справку по этой команде. `help pdb` отображает полную документацию (docstring модуля `pdb`). Поскольку аргумент *команда* должен быть идентификатором, для получения справки по команде `!` необходимо ввести `help exec`.287288#### `w(here) [count]`289290Выводит трассировку стека, где самый последний фрейм находится внизу. Если *count* равен 0, выводится запись текущего фрейма. Если *count* отрицателен, выводятся самые старые *count* фреймов. Если *count* положителен, выводятся самые последние *count* фреймов. Стрелка (`>`) указывает текущий фрейм, который определяет контекст большинства команд.291292Изменено в версии 3.14: Добавлен аргумент *count*.293294#### `d(own) [count]`295296Переместить текущий кадр на *count* (по умолчанию один) уровней вниз по трассировке стека (к более новому кадру).297298#### `u(p) [count]`299300Переместить текущий кадр на *count* (по умолчанию один) уровней вверх по трассировке стека (к более старому кадру).301302#### `b(reak) [([filename:]lineno | function) [, condition]]`303304С аргументом *lineno* устанавливает точку останова на строке *lineno* в текущем файле. Номер строки может быть предварительно указан с *filename* и двоеточием, чтобы задать точку останова в другом файле (возможно, ещё не загруженном). Файл ищется на [`sys.path`](https://python-all.ru/3.16/library/sys.html#sys.path). Допустимые формы *filename* это `/abspath/to/file.py`, `relpath/file.py`, `module` и `package.module`.305306С аргументом *function* устанавливает точку останова на первом исполняемом операторе внутри этой функции. *function* может быть любым выражением, которое вычисляется в функцию в текущем пространстве имён.307308Если присутствует второй аргумент, это выражение, которое должно вычисляться в true (истина), чтобы точка останова сработала.309310Без аргумента выводит список всех точек останова, включая для каждой точки останова количество срабатываний, текущий счётчик игнорирования и связанное условие, если оно есть.311312Каждой точке останова присваивается номер, на который ссылаются все остальные команды точек останова.313314#### `tbreak [([filename:]lineno | function) [, condition]]`315316Временная точка останова, которая удаляется автоматически при первом срабатывании. Аргументы такие же, как для [`break`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-break).317318#### `cl(ear) [filename:lineno | bpnumber ...]`319320С аргументом *filename:lineno* удаляет все точки останова на этой строке. С разделённым пробелами списком номеров точек останова удаляет указанные точки останова. Без аргумента удаляет все точки останова (но сначала запрашивает подтверждение).321322#### `disable bpnumber [bpnumber ...]`323324Отключает точки останова, заданные разделённым пробелами списком номеров точек останова. Отключение точки останова означает, что она не может приостановить выполнение программы, но в отличие от удаления точки останова, она остаётся в списке точек останова и может быть (повторно) включена.325326#### `enable bpnumber [bpnumber ...]`327328Включает указанные точки останова.329330#### `ignore bpnumber [count]`331332Устанавливает счётчик игнорирования для заданного номера точки останова. Если *count* опущен, счётчик игнорирования устанавливается в 0. Точка останова становится активной, когда счётчик игнорирования равен нулю. Если он не равен нулю, *count* уменьшается каждый раз, когда точка останова достигается, и точка останова не отключена, и любое связанное условие принимает значение true.333334#### `condition bpnumber [condition]`335336Устанавливает новое *condition* для точки останова – выражение, которое должно вычисляться в true, чтобы точка останова сработала. Если *condition* отсутствует, любое существующее условие удаляется; т.е. точка останова становится безусловной.337338#### `commands [bpnumber]`339340Задаёт список команд для точки останова с номером *bpnumber*. Сами команды вводятся на следующих строках. Введите строку, содержащую только `end`, чтобы завершить список команд. Пример:341342```python343(Pdb) commands 1344(com) p some_variable345(com) end346(Pdb)347```348349Чтобы удалить все команды из точки останова, введите `commands` и сразу за ним `end`; то есть не давайте никаких команд.350351Если аргумент *bpnumber* не указан, `commands` относится к последней установленной точке останова, которая ещё существует.352353Можно использовать команды точки останова для перезапуска программы. Просто используйте команду [`continue`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-continue), или [`step`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-step), или любую другую команду, которая возобновляет выполнение.354355Указание любой команды, возобновляющей выполнение (в настоящее время [`continue`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-continue), [`step`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-step), [`next`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-next), [`return`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-return), [`until`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-until), [`jump`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-jump), [`quit`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-quit) и их сокращения) завершает список команд (как если бы после этой команды сразу следовало end). Это связано с тем, что каждый раз при возобновлении выполнения (даже с помощью простого next или step) можно столкнуться с другой точкой останова, у которой может быть свой список команд, что приводит к неоднозначности относительно того, какой список выполнять.356357Если список команд содержит команду `silent` или команду, которая возобновляет выполнение, то сообщение точки останова, содержащее информацию о кадре, не отображается.358359Изменено в версии 3.14: Информация о кадре не будет отображаться, если в списке команд присутствует команда, которая возобновляет выполнение.360361#### `s(tep)`362363Выполняет текущую строку, останавливается при первой возможности (либо в вызываемой функции, либо на следующей строке в текущей функции).364365#### `n(ext)`366367Продолжает выполнение до следующей строки в текущей функции или до её возврата. (Разница между [`next`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-next) и [`step`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-step) в том, что `step` останавливается внутри вызванной функции, тогда как `next` выполняет вызванные функции (почти) на полной скорости, останавливаясь только на следующей строке в текущей функции.)368369#### `unt(il) [lineno]`370371Без аргумента продолжает выполнение до строки с номером, большим текущего.372373С *lineno* продолжает выполнение до строки с номером, большим или равным *lineno*. В обоих случаях также останавливается при возврате текущего фрейма.374375Изменено в версии 3.2: Добавлена возможность явно указывать номер строки.376377#### `r(eturn)`378379Продолжает выполнение до возврата текущей функции.380381#### `c(ont(inue))`382383Продолжает выполнение, останавливаясь только при встрече точки останова.384385#### `j(ump) lineno`386387Устанавливает следующую строку для выполнения. Доступно только в самом нижнем фрейме. Это позволяет вернуться назад и выполнить код снова, или перейти вперёд, пропустив ненужный код.388389Следует отметить, что не все переходы разрешены – например, нельзя перейти внутрь цикла [`for`](https://python-all.ru/3.16/reference/compound_stmts.html#for) или выйти из конструкции [`finally`](https://python-all.ru/3.16/reference/compound_stmts.html#finally).390391#### `l(ist) [first[, last]]`392393Выводит исходный код текущего файла. Без аргументов выводит 11 строк вокруг текущей строки или продолжает предыдущий вывод. С `.` в качестве аргумента выводит 11 строк вокруг текущей строки. С одним аргументом выводит 11 строк вокруг указанной строки. С двумя аргументами выводит заданный диапазон; если второй аргумент меньше первого, он интерпретируется как количество.394395Текущая строка в текущем фрейме помечается `->`. Если отлаживается исключение, строка, где оно было первоначально вызвано или распространено, помечается `>>`, если она отличается от текущей.396397Изменено в версии 3.2: Добавлен маркер `>>`.398399#### `ll | longlist`400401Выводит весь исходный код текущей функции или фрейма. Интересные строки помечаются так же, как для [`list`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-list).402403Добавлено в версии 3.2.404405#### `a(rgs)`406407Выводит аргументы текущей функции и их текущие значения.408409#### `p expression`410411Вычисляет *expression* в текущем контексте и выводит его значение.412413> **Примечание**414>415> `print()` также можно использовать, но это не команда отладчика – выполняется функция Python [`print()`](https://python-all.ru/3.16/library/functions.html#print).416417#### `pp expression`418419Как команда [`p`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-p), но значение *expression* красиво выводится с помощью модуля [`pprint`](https://python-all.ru/3.16/library/pprint.html#module-pprint).420421#### `whatis expression`422423Выводит тип *expression*.424425#### `source expression`426427Пытается получить исходный код *expression* и отобразить его.428429Добавлено в версии 3.2.430431#### `display [expression]`432433Отображает значение *expression*, если оно изменилось, каждый раз при остановке выполнения в текущем фрейме.434435Без *expression* выводит все выражения для отображения в текущем фрейме.436437> **Примечание**438>439> Display вычисляет *выражение* и сравнивает с результатом предыдущего вычисления *выражения*, поэтому если результат изменяем, display может не замечать изменений.440441Пример:442443```python444lst = []445breakpoint()446pass447lst.append(1)448print(lst)449```450451Display не заметит, что `lst` изменился, потому что результат вычисления изменяется на месте с помощью `lst.append(1)` до сравнения:452453```python454> example.py(3)<module>()455-> pass456(Pdb) display lst457display lst: []458(Pdb) n459> example.py(4)<module>()460-> lst.append(1)461(Pdb) n462> example.py(5)<module>()463-> print(lst)464(Pdb)465```466467Можно применить некоторые трюки с механизмом копирования, чтобы это сработало:468469```python470> example.py(3)<module>()471-> pass472(Pdb) display lst[:]473display lst[:]: []474(Pdb) n475> example.py(4)<module>()476-> lst.append(1)477(Pdb) n478> example.py(5)<module>()479-> print(lst)480display lst[:]: [1]  [old: []]481(Pdb)482```483484Добавлено в версии 3.2.485486#### `undisplay [expression]`487488Больше не показывать *выражение* в текущем фрейме. Без *выражения* очистить все display-выражения для текущего фрейма.489490Добавлено в версии 3.2.491492#### `interact`493494Запускает интерактивный интерпретатор (с использованием модуля [`code`](https://python-all.ru/3.16/library/code.html#module-code)) в новом глобальном пространстве имён, инициализированном из локального и глобального пространств имён текущей области видимости. Используйте `exit()` или `quit()` для выхода из интерпретатора и возврата в отладчик.495496> **Примечание**497>498> Поскольку `interact` создаёт новое отдельное пространство имён для выполнения кода, присваивания переменным не повлияют на исходные пространства имён. Однако изменения любых изменяемых объектов, на которые есть ссылки, будут отражены в исходных пространствах имён как обычно.499500Добавлено в версии 3.2.501502Изменено в версии 3.13: `exit()` и `quit()` можно использовать для выхода из команды [`interact`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-interact) .503504Изменено в версии 3.13: [`interact`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-interact) направляет свой вывод в канал вывода отладчика, а не в [`sys.stderr`](https://python-all.ru/3.16/library/sys.html#sys.stderr).505506#### `alias [name [command]]`507508Создаёт псевдоним с именем *name*, который выполняет *command*. *Команда* *не* должна быть заключена в кавычки. Заменяемые параметры можно указывать с помощью `%1`, `%2`, … и `%9`, при этом `%*` заменяется на все параметры. Если *command* опущен, отображается текущий псевдоним для *name*. Если не указаны аргументы, перечисляются все псевдонимы.509510Псевдонимы могут быть вложенными и могут содержать всё, что можно ввести в приглашении pdb. Обратите внимание, что внутренние команды pdb *могут* быть переопределены псевдонимами. Такая команда затем скрывается, пока псевдоним не удалён. Псевдонимы рекурсивно применяются к первому слову командной строки; все остальные слова в строке остаются нетронутыми.511512В качестве примера – два полезных псевдонима (особенно если они помещены в файл `.pdbrc`):513514```python515# Вывести переменные экземпляра (использование "pi classInst")516alias pi for k in %1.__dict__.keys(): print(f"%1.{k} = {%1.__dict__[k]}")517# Вывести переменные экземпляра в self518alias ps pi self519```520521#### `unalias name`522523Удаляет указанный псевдоним *имя*.524525#### `! statement`526527Выполняет (однострочную) *инструкцию* в контексте текущего стекового фрейма. Восклицательный знак можно опустить, если первое слово инструкции не похоже на команду отладчика, например:528529```text530(Pdb) ! n=42531(Pdb)532```533534Чтобы установить глобальную переменную, можно перед командой присваивания поставить инструкцию [`global`](https://python-all.ru/3.16/reference/simple_stmts.html#global) в той же строке, например:535536```text537(Pdb) global list_options; list_options = ['-l']538(Pdb)539```540541#### `run [args ...]`542543#### `restart [args ...]`544545Перезапускает отлаживаемую программу Python. Если указаны *аргументы*, они разделяются с помощью [`shlex`](https://python-all.ru/3.16/library/shlex.html#module-shlex) и результат используется как новое [`sys.argv`](https://python-all.ru/3.16/library/sys.html#sys.argv). История, точки останова, действия и опции отладчика сохраняются. [`restart`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-restart) является псевдонимом для [`run`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-run).546547Изменено в версии 3.14: команды [`run`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-run) и [`restart`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-restart) отключены, когда отладчик вызван в режиме `'inline'`.548549#### `q(uit)`550551Выход из отладчика. Выполняемая программа прерывается. Ввод символа конца файла эквивалентен [`quit`](https://python-all.ru/3.16/library/pdb.html#pdbcommand-quit).552553Будет показан запрос подтверждения, если отладчик вызван в режиме `'inline'`. Любое из `y`, `Y`, `<Enter>` или `EOF` подтвердит выход.554555Изменено в версии 3.14: Будет показан запрос подтверждения, если отладчик вызван в режиме `'inline'`. После подтверждения отладчик немедленно вызовет [`sys.exit()`](https://python-all.ru/3.16/library/sys.html#sys.exit), а не возбудит [`bdb.BdbQuit`](https://python-all.ru/3.16/library/bdb.html#bdb.BdbQuit) в следующем событии трассировки.556557#### `debug code`558559Входит в рекурсивный отладчик, который пошагово выполняет *код* (произвольное выражение или инструкцию для выполнения в текущем окружении).560561#### `retval`562563Печатает возвращаемое значение последнего возврата текущей функции.564565#### `exceptions [excnumber]`566567Список или переключение между связанными исключениями.568569При использовании `pdb.pm()` или `Pdb.post_mortem(...)` со связанным исключением вместо трассировки стека это позволяет пользователю перемещаться между связанными исключениями с помощью команды `exceptions` для вывода списка исключений и `exceptions <number>` для переключения на это исключение.570571Пример:572573```python574def out():575    try:576        middle()577    except Exception as e:578        raise ValueError("reraise middle() error") from e579580def middle():581    try:582        return inner(0)583    except Exception as e:584        raise ValueError("Middle fail")585586def inner(x):587    1 / x588589 out()590```591592вызов `pdb.pm()` позволит перемещаться между исключениями:593594```python595> example.py(5)out()596-> raise ValueError("reraise middle() error") from e597598(Pdb) exceptions599  0 ZeroDivisionError('division by zero')600  1 ValueError('Middle fail')601> 2 ValueError('reraise middle() error')602603(Pdb) exceptions 0604> example.py(16)inner()605-> 1 / x606607(Pdb) up608> example.py(10)middle()609-> return inner(0)610```611612Добавлено в версии 3.13.613614Сноски615616\[[1](https://python-all.ru/3.16/library/pdb.html#id1)\]617618Принадлежность фрейма к определённому модулю определяется значением `__name__` в глобальных переменных фрейма.619