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

pdb.md

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

1> **Источник:** https://python-all.ru/3.8/library/pdb.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`pdb`](https://python-all.ru/3.8/library/pdb.html#module-pdb) – Отладчик Python89**Исходный код:** [Lib/pdb.py](https://python-all.ru/src/3.8/Lib/pdb.py)1011---1213Модуль [`pdb`](https://python-all.ru/3.8/library/pdb.html#module-pdb) определяет интерактивный отладчик исходного кода для программ на Python. Он поддерживает установку (условных) точек останова и пошаговое исполнение на уровне строк исходного кода, просмотр стековых фреймов, отображение исходного кода и выполнение произвольного кода Python в контексте любого фрейма. Также поддерживается посмертная отладка, и его можно вызывать программно.1415Отладчик расширяем – на самом деле он определён как класс [`Pdb`](https://python-all.ru/3.8/library/pdb.html#pdb.Pdb). В настоящее время это не документировано, но легко понять из исходного кода. Интерфейс расширения использует модули [`bdb`](https://python-all.ru/3.8/library/bdb.html#module-bdb) и [`cmd`](https://python-all.ru/3.8/library/cmd.html#module-cmd).1617Приглашение отладчика – `(Pdb)`. Обычное использование для запуска программы под управлением отладчика:1819```python20>>> import pdb21>>> import mymodule22>>> pdb.run('mymodule.test()')23> <string>(0)?()24(Pdb) continue25> <string>(1)?()26(Pdb) continue27NameError: 'spam'28> <string>(1)?()29(Pdb)30```3132Изменено в версии 3.3: Автодополнение по табуляции через модуль [`readline`](https://python-all.ru/3.8/library/readline.html#module-readline) доступно для команд и их аргументов; например, текущие глобальные и локальные имена предлагаются как аргументы команды `p`.3334`pdb.py` также можно вызвать как скрипт для отладки других скриптов. Например:3536```python37python3 -m pdb myscript.py38```3940При вызове в качестве скрипта pdb автоматически переходит в режим посмертной отладки, если отлаживаемая программа завершается аварийно. После посмертной отладки (или после нормального завершения программы) pdb перезапускает программу. Автоматический перезапуск сохраняет состояние pdb (например, точки останова) и в большинстве случаев полезнее, чем выход из отладчика при завершении программы.4142Новое в версии 3.2: `pdb.py` теперь принимает опцию `-c`, которая выполняет команды, как если бы они были заданы в файле `.pdbrc`; см. [Команды отладчика](https://python-all.ru/3.8/library/pdb.html#debugger-commands).4344Новое в версии 3.7: `pdb.py` теперь принимает опцию `-m`, которая выполняет модули подобно тому, как это делает `python3 -m`. Как и в случае со скриптом, отладчик приостановит выполнение прямо перед первой строкой модуля.4546Обычный способ войти в отладчик из работающей программы – вставить4748```python49import pdb; pdb.set_trace()50```5152в месте, где требуется войти в отладчик. Затем можно пошагово выполнять код после этого оператора и продолжить выполнение без отладчика с помощью команды [`continue`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-continue).5354Новое в версии 3.7: Встроенную [`breakpoint()`](https://python-all.ru/3.8/library/functions.html#breakpoint) при вызове со значениями по умолчанию можно использовать вместо `import pdb; pdb.set_trace()`.5556Типичное использование для анализа аварийно завершившейся программы:5758```python59>>> import pdb60>>> import mymodule61>>> mymodule.test()62Traceback (most recent call last):63  File "<stdin>", line 1, in <module>64  File "./mymodule.py", line 4, in test65    test2()66  File "./mymodule.py", line 3, in test267    print(spam)68NameError: spam69>>> pdb.pm()70> ./mymodule.py(3)test2()71-> print(spam)72(Pdb)73```7475Модуль определяет следующие функции; каждая из них запускает отладчик немного по-своему:7677#### `pdb.run(statement, globals=None, locals=None)`7879Выполняет *инструкцию* (заданную как строку или объект кода) под управлением отладчика. Приглашение отладчика появляется до выполнения любого кода; можно установить точки останова и ввести [`continue`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-continue), или пошагово пройти инструкцию с помощью [`step`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-step) или [`next`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-next) (все эти команды описаны ниже). Необязательные аргументы *globals* и *locals* задают окружение, в котором выполняется код; по умолчанию используется словарь модуля [`__main__`](https://python-all.ru/3.8/library/__main__.html#module-__main__). (См. описание встроенных функций [`exec()`](https://python-all.ru/3.8/library/functions.html#exec) или [`eval()`](https://python-all.ru/3.8/library/functions.html#eval).)8081#### `pdb.runeval(expression, globals=None, locals=None)`8283Вычисляет *выражение* (заданное в виде строки или объекта кода) под управлением отладчика. Когда [`runeval()`](https://python-all.ru/3.8/library/pdb.html#pdb.runeval) возвращает управление, возвращается значение выражения. В остальном эта функция аналогична [`run()`](https://python-all.ru/3.8/library/pdb.html#pdb.run).8485#### `pdb.runcall(function, *args, **kwds)`8687Вызывает *функцию* (объект функции или метода, а не строку) с заданными аргументами. Когда [`runcall()`](https://python-all.ru/3.8/library/pdb.html#pdb.runcall) возвращает управление, возвращается результат вызова функции. Приглашение отладчика появляется сразу после входа в функцию.8889#### `pdb.set_trace(*, header=None)`9091Входит в отладчик на фрейме стека вызова. Это полезно для жёсткого задания точки останова в определённом месте программы, даже если код не отлаживается другим способом (например, при сбое утверждения). Если передан *header*, он выводится на консоль непосредственно перед началом отладки.9293Изменено в версии 3.7: Добавлен именованный аргумент *header*.9495#### `pdb.post_mortem(traceback=None)`9697Запускает посмертную отладку для указанного объекта *traceback*. Если объект *traceback* не указан, используется объект traceback текущего обрабатываемого исключения (исключение должно обрабатываться, чтобы значение по умолчанию сработало).9899#### `pdb.pm()`100101Запускает посмертную отладку для traceback, найденного в [`sys.last_traceback`](https://python-all.ru/3.8/library/sys.html#sys.last_traceback).102103Функции `run*` и [`set_trace()`](https://python-all.ru/3.8/library/pdb.html#pdb.set_trace) являются псевдонимами для создания экземпляра класса [`Pdb`](https://python-all.ru/3.8/library/pdb.html#pdb.Pdb) и вызова одноимённого метода. Если требуется доступ к дополнительным возможностям, это нужно сделать самостоятельно:104105#### `class pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False, readrc=True)`106107[`Pdb`](https://python-all.ru/3.8/library/pdb.html#pdb.Pdb) – это класс отладчика.108109Аргументы *completekey*, *stdin* и *stdout* передаются базовому классу [`cmd.Cmd`](https://python-all.ru/3.8/library/cmd.html#cmd.Cmd); см. описание там.110111Аргумент *skip*, если задан, должен быть итерабельным с шаблонами имён модулей в стиле glob. Отладчик не будет входить в фреймы, происходящие из модуля, который соответствует одному из этих шаблонов. [1](https://python-all.ru/3.8/library/pdb.html#id3)112113По умолчанию Pdb устанавливает обработчик сигнала SIGINT (который отправляется, когда пользователь нажимает `Ctrl-C` на консоли) при вводе команды `continue`. Это позволяет снова войти в отладчик, нажав `Ctrl-C`. Если требуется, чтобы Pdb не изменял обработчик SIGINT, установите *nosigint* в значение true.114115Аргумент *readrc* по умолчанию равен true и определяет, будет ли Pdb загружать файлы .pdbrc из файловой системы.116117Пример вызова для включения трассировки с *skip*:118119```python120import pdb; pdb.Pdb(skip=['django.*']).set_trace()121```122123Возбуждает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `pdb.Pdb` без аргументов.124125Новое в версии 3.1: аргумент *skip*.126127Новое в версии 3.2: Аргумент *nosigint*. Ранее обработчик SIGINT никогда не устанавливался Pdb.128129Изменено в версии 3.6: Добавлен аргумент *readrc*.130131#### `run(statement, globals=None, locals=None)`132133#### `runeval(expression, globals=None, locals=None)`134135#### `runcall(function, *args, **kwds)`136137#### `set_trace()`138139См. документацию по функциям, описанным выше.140141## Команды отладчика142143Команды, распознаваемые отладчиком, перечислены ниже. Большинство команд можно сократить до одной или двух букв, как указано; например, `h(elp)` означает, что для ввода команды help можно использовать `h` или `help` (но не `he` или `hel`, а также не `H` или `Help` или `HELP`). Аргументы команд должны разделяться пробельными символами (пробелами или табуляцией). Необязательные аргументы заключаются в квадратные скобки (`[]`) в синтаксисе команды; сами скобки вводить не нужно. Альтернативы в синтаксисе команды разделяются вертикальной чертой (`|`).144145Ввод пустой строки повторяет последнюю введённую команду. Исключение: если последней командой была [`list`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-list), то будут выведены следующие 11 строк.146147Команды, которые отладчик не распознает, считаются операторами Python и выполняются в контексте отлаживаемой программы. Операторы Python также можно начинать с восклицательного знака (`!`). Это мощный способ исследовать отлаживаемую программу; можно даже изменить переменную или вызвать функцию. Если в таком операторе возникает исключение, выводится его имя, но состояние отладчика не меняется.148149Отладчик поддерживает [псевдонимы](https://python-all.ru/3.8/library/pdb.html#debugger-aliases). Псевдонимы могут иметь параметры, что обеспечивает некоторую гибкость в зависимости от контекста.150151Несколько команд можно ввести в одной строке, разделив их `;;`. (Одиночный `;` не используется, так как он является разделителем для нескольких команд в строке, передаваемой парсеру Python.) При разделении команд не применяется никакая интеллектуальная обработка; входная строка разбивается по первой паре `;;`, даже если она находится внутри строки в кавычках.152153Если файл `.pdbrc` существует в домашнем каталоге пользователя или в текущем каталоге, он читается и выполняется так, как если бы он был введён в приглашении отладчика. Это особенно полезно для псевдонимов. Если оба файла существуют, сначала читается файл из домашнего каталога, и псевдонимы, определённые в нём, могут быть переопределены локальным файлом.154155Изменено в версии 3.2: `.pdbrc` теперь может содержать команды, продолжающие отладку, например [`continue`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-continue) или [`next`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-next). Ранее эти команды не действовали.156157**`h(elp)``[command]`**158159Без аргументов выводит список доступных команд. С аргументом *команда* выводит справку по этой команде. `help pdb` отображает полную документацию (docstring модуля [`pdb`](https://python-all.ru/3.8/library/pdb.html#module-pdb)). Поскольку аргумент *команда* должен быть идентификатором, для получения справки по команде `!` необходимо ввести `help exec`.160161**`w(here)`**162163Печатает трассировку стека, причём самый новый фрейм находится внизу. Стрелка указывает на текущий фрейм, который определяет контекст большинства команд.164165**`d(own)``[count]`**166167Переместить текущий кадр на *count* (по умолчанию один) уровней вниз по трассировке стека (к более новому кадру).168169**`u(p)``[count]`**170171Переместить текущий кадр на *count* (по умолчанию один) уровней вверх по трассировке стека (к более старому кадру).172173**`b(reak)``[([filename:]lineno | function) [, condition]]`**174175С аргументом *lineno* устанавливает точку остановки в текущем файле на указанной строке. С аргументом *function* устанавливает точку остановки на первом исполняемом операторе внутри этой функции. Номер строки может быть предварён именем файла и двоеточием, чтобы указать точку остановки в другом файле (возможно, ещё не загруженном). Файл ищется в [`sys.path`](https://python-all.ru/3.8/library/sys.html#sys.path). Обратите внимание: каждой точке остановки присваивается номер, на который ссылаются все остальные команды управления точками остановки.176177Если присутствует второй аргумент, это выражение, которое должно вычисляться в true (истина), чтобы точка останова сработала.178179Без аргумента выводит список всех точек останова, включая для каждой точки останова количество срабатываний, текущий счётчик игнорирования и связанное условие, если оно есть.180181**`tbreak``[([filename:]lineno | function) [, condition]]`**182183Временная точка останова, которая удаляется автоматически при первом срабатывании. Аргументы такие же, как для [`break`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-break).184185**`cl(ear)``[filename:lineno | bpnumber [bpnumber ...]]`**186187С аргументом *filename:lineno* удаляет все точки останова на этой строке. С разделённым пробелами списком номеров точек останова удаляет указанные точки останова. Без аргумента удаляет все точки останова (но сначала запрашивает подтверждение).188189**`disable``[bpnumber [bpnumber ...]]`**190191Отключает точки останова, заданные разделённым пробелами списком номеров точек останова. Отключение точки останова означает, что она не может приостановить выполнение программы, но в отличие от удаления точки останова, она остаётся в списке точек останова и может быть (повторно) включена.192193**`enable``[bpnumber [bpnumber ...]]`**194195Включает указанные точки останова.196197**`ignore``bpnumber [count]`**198199Устанавливает счётчик игнорирования для заданного номера точки останова. Если счётчик не указан, счётчик игнорирования устанавливается в 0. Точка останова становится активной, когда счётчик игнорирования равен нулю. Если он не равен нулю, счётчик уменьшается каждый раз, когда точка останова достигается, и она не отключена, и любое связанное с ней условие истинно.200201**`condition``bpnumber [condition]`**202203Устанавливает новое *condition* для точки останова – выражение, которое должно вычисляться в true, чтобы точка останова сработала. Если *condition* отсутствует, любое существующее условие удаляется; т.е. точка останова становится безусловной.204205**`commands``[bpnumber]`**206207Задаёт список команд для точки останова с номером *bpnumber*. Сами команды вводятся на следующих строках. Введите строку, содержащую только `end`, чтобы завершить список команд. Пример:208209```python210(Pdb) commands 1211(com) p some_variable212(com) end213(Pdb)214```215216Чтобы удалить все команды из точки останова, введите `commands` и сразу за ним `end`; то есть не давайте никаких команд.217218Без аргумента *bpnumber* команда `commands` относится к последней установленной точке останова.219220Можно использовать команды точки останова для перезапуска программы. Просто используйте команду [`continue`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-continue), или [`step`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-step), или любую другую команду, которая возобновляет выполнение.221222Указание любой команды, возобновляющей выполнение ([`continue`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-continue), [`step`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-step), [`next`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-next), [`return`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-return), [`jump`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-jump), [`quit`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-quit) и их сокращения), завершает список команд (как если бы за этой командой сразу следовало end). Это происходит потому, что при каждом возобновлении выполнения (даже с помощью простого next или step) может быть встречена другая точка останова, у которой может быть свой список команд, что приводит к неоднозначности: какой список выполнять.223224Если в списке команд используется команда ‘silent’, обычное сообщение об остановке на точке останова не выводится. Это может быть удобно для точек останова, которые должны выводить определённое сообщение и затем продолжать. Если никакие другие команды ничего не выводят, вы не увидите признака того, что точка останова была достигнута.225226**`s(tep)`**227228Выполняет текущую строку, останавливается при первой возможности (либо в вызываемой функции, либо на следующей строке в текущей функции).229230**`n(ext)`**231232Продолжает выполнение до следующей строки в текущей функции или до её возврата. (Разница между [`next`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-next) и [`step`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-step) в том, что [`step`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-step) останавливается внутри вызванной функции, тогда как [`next`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-next) выполняет вызванные функции (почти) на полной скорости, останавливаясь только на следующей строке в текущей функции.)233234**`unt(il)``[lineno]`**235236Без аргумента продолжает выполнение до строки с номером, большим текущего.237238С номером строки продолжает выполнение до достижения строки с номером, большим или равным указанному. В обоих случаях также останавливается при возврате из текущего фрейма.239240Изменено в версии 3.2: Добавлена возможность явно указывать номер строки.241242**`r(eturn)`**243244Продолжает выполнение до возврата текущей функции.245246**`c(ont(inue))`**247248Продолжает выполнение, останавливаясь только при встрече точки останова.249250**`j(ump)``lineno`**251252Устанавливает следующую строку для выполнения. Доступно только в самом нижнем фрейме. Это позволяет вернуться назад и выполнить код снова, или перейти вперёд, пропустив ненужный код.253254Следует отметить, что не все переходы разрешены – например, нельзя перейти внутрь цикла [`for`](https://python-all.ru/3.8/reference/compound_stmts.html#for) или выйти из конструкции [`finally`](https://python-all.ru/3.8/reference/compound_stmts.html#finally).255256**`l(ist)``[first[, last]]`**257258Выводит исходный код текущего файла. Без аргументов выводит 11 строк вокруг текущей строки или продолжает предыдущий вывод. С `.` в качестве аргумента выводит 11 строк вокруг текущей строки. С одним аргументом выводит 11 строк вокруг указанной строки. С двумя аргументами выводит заданный диапазон; если второй аргумент меньше первого, он интерпретируется как количество.259260Текущая строка в текущем фрейме помечается `->`. Если отлаживается исключение, строка, где оно было первоначально вызвано или распространено, помечается `>>`, если она отличается от текущей.261262Новое в версии 3.2: Маркер `>>`.263264**`ll``| longlist`**265266Выводит весь исходный код текущей функции или фрейма. Интересные строки помечаются так же, как для [`list`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-list).267268Новое в версии 3.2.269270**`a(rgs)`**271272Печатает список аргументов текущей функции.273274**`p``expression`**275276Вычисляет *выражение* в текущем контексте и выводит его значение.277278> **Примечание**279>280> `print()` также можно использовать, но это не команда отладчика – выполняется функция Python [`print()`](https://python-all.ru/3.8/library/functions.html#print).281282**`pp``expression`**283284Как команда [`p`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-p), за исключением того, что значение выражения выводится в удобном формате с помощью модуля [`pprint`](https://python-all.ru/3.8/library/pprint.html#module-pprint).285286**`whatis``expression`**287288Выводит тип *выражения*.289290**`source``expression`**291292Пытается получить исходный код для указанного объекта и отобразить его.293294Новое в версии 3.2.295296**`display``[expression]`**297298Отображает значение выражения, если оно изменилось, каждый раз при остановке выполнения в текущем фрейме.299300Без выражения выводит список всех отображаемых выражений для текущего фрейма.301302Новое в версии 3.2.303304**`undisplay``[expression]`**305306Больше не отображает выражение в текущем фрейме. Без выражения очищает все отображаемые выражения для текущего фрейма.307308Новое в версии 3.2.309310**`interact`**311312Запускает интерактивный интерпретатор (с использованием модуля [`code`](https://python-all.ru/3.8/library/code.html#module-code)), чьё глобальное пространство имён содержит все (глобальные и локальные) имена, найденные в текущей области видимости.313314Новое в версии 3.2.315316**`alias``[name [command]]`**317318Создаёт псевдоним с именем *name*, который выполняет *команду*. Команда *не* должна заключаться в кавычки. Заменяемые параметры могут обозначаться как `%1`, `%2` и так далее, а `%*` заменяется всеми параметрами. Если команда не указана, показывается текущий псевдоним для *name*. Если аргументы не указаны, выводятся все псевдонимы.319320Псевдонимы могут быть вложенными и могут содержать всё, что можно ввести в приглашении pdb. Обратите внимание, что внутренние команды pdb *могут* быть переопределены псевдонимами. Такая команда затем скрывается, пока псевдоним не удалён. Псевдонимы рекурсивно применяются к первому слову командной строки; все остальные слова в строке остаются нетронутыми.321322В качестве примера – два полезных псевдонима (особенно если они помещены в файл `.pdbrc`):323324```python325# Вывести переменные экземпляра (использование "pi classInst")326alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])327# Вывести переменные экземпляра в self328alias ps pi self329```330331**`unalias``name`**332333Удаляет указанный псевдоним.334335**`!``statement`**336337Выполняет (однострочную) *инструкцию* в контексте текущего кадра стека. Восклицательный знак можно опустить, если первое слово инструкции не напоминает команду отладчика. Чтобы установить глобальную переменную, можно указать [`global`](https://python-all.ru/3.8/reference/simple_stmts.html#global) перед инструкцией присваивания в той же строке, например:338339```python340(Pdb) global list_options; list_options = ['-l']341(Pdb)342```343344**`run``[args ...]`**345346**`restart``[args ...]`**347348Перезапускает отлаживаемую программу Python. Если указан аргумент, он разбивается с помощью [`shlex`](https://python-all.ru/3.8/library/shlex.html#module-shlex), и результат используется как новый [`sys.argv`](https://python-all.ru/3.8/library/sys.html#sys.argv). История, точки останова, действия и параметры отладчика сохраняются. [`restart`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-restart) – это псевдоним для [`run`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-run).349350**`q(uit)`**351352Выход из отладчика. Выполнение программы прерывается.353354**`debug``code`**355356Входит в рекурсивный отладчик, который выполняет пошагово аргумент (который является произвольным выражением или инструкцией, выполняемой в текущем окружении).357358**`retval`**359360Печатает возвращаемое значение последнего возврата из функции.361362Сноски363364**[1](https://python-all.ru/3.8/library/pdb.html#id1)**365366Принадлежность фрейма к определённому модулю определяется значением `__name__` в глобальных переменных фрейма.367