pdb.md
1> **Источник:** https://python-all.ru/3.6/library/pdb.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 27.3. [`pdb`](https://python-all.ru/3.6/library/pdb.html#module-pdb) – Отладчик Python89**Исходный код:** [Lib/pdb.py](https://python-all.ru/src/3.6/Lib/pdb.py)1011---1213Модуль [`pdb`](https://python-all.ru/3.6/library/pdb.html#module-pdb) определяет интерактивный отладчик исходного кода для программ на Python. Он поддерживает установку (условных) точек останова и пошаговое исполнение на уровне строк исходного кода, просмотр стековых фреймов, отображение исходного кода и выполнение произвольного кода Python в контексте любого фрейма. Также поддерживается посмертная отладка, и его можно вызывать программно.1415Отладчик расширяем – на самом деле он определён как класс [`Pdb`](https://python-all.ru/3.6/library/pdb.html#pdb.Pdb). В настоящее время это не документировано, но легко понять из исходного кода. Интерфейс расширения использует модули [`bdb`](https://python-all.ru/3.6/library/bdb.html#module-bdb) и [`cmd`](https://python-all.ru/3.6/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.6/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.6/library/pdb.html#debugger-commands).4344Обычный способ войти в отладчик из работающей программы – вставить4546```python47import pdb; pdb.set_trace()48```4950в месте, где требуется войти в отладчик. Затем можно пошагово выполнять код после этого оператора и продолжить выполнение без отладчика с помощью команды [`continue`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-continue).5152Типичное использование для анализа аварийно завершившейся программы:5354```python55>>> import pdb56>>> import mymodule57>>> mymodule.test()58Traceback (most recent call last):59 File "<stdin>", line 1, in <module>60 File "./mymodule.py", line 4, in test61 test2()62 File "./mymodule.py", line 3, in test263 print(spam)64NameError: spam65>>> pdb.pm()66> ./mymodule.py(3)test2()67-> print(spam)68(Pdb)69```7071Модуль определяет следующие функции; каждая из них запускает отладчик немного по-своему:7273#### `pdb.run(statement, globals=None, locals=None)`7475Выполняет *инструкцию* (заданную как строку или объект кода) под управлением отладчика. Приглашение отладчика появляется до выполнения любого кода; можно установить точки останова и ввести [`continue`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-continue), или пошагово пройти инструкцию с помощью [`step`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-step) или [`next`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-next) (все эти команды описаны ниже). Необязательные аргументы *globals* и *locals* задают окружение, в котором выполняется код; по умолчанию используется словарь модуля [`__main__`](https://python-all.ru/3.6/library/__main__.html#module-__main__). (См. описание встроенных функций [`exec()`](https://python-all.ru/3.6/library/functions.html#exec) или [`eval()`](https://python-all.ru/3.6/library/functions.html#eval).)7677#### `pdb.runeval(expression, globals=None, locals=None)`7879Вычисляет *выражение* (заданное в виде строки или объекта кода) под управлением отладчика. Когда [`runeval()`](https://python-all.ru/3.6/library/pdb.html#pdb.runeval) возвращает управление, возвращается значение выражения. В остальном эта функция аналогична [`run()`](https://python-all.ru/3.6/library/pdb.html#pdb.run).8081#### `pdb.runcall(function, *args, **kwds)`8283Вызывает *функцию* (объект функции или метода, а не строку) с заданными аргументами. Когда [`runcall()`](https://python-all.ru/3.6/library/pdb.html#pdb.runcall) возвращает управление, возвращается результат вызова функции. Приглашение отладчика появляется сразу после входа в функцию.8485#### `pdb.set_trace()`8687Выполняет вход в отладчик на стековом фрейме вызвавшей функции. Это полезно для установки точки останова в заданном месте программы, даже если в остальном код не отлаживается (например, при ошибке утверждения).8889#### `pdb.post_mortem(traceback=None)`9091Запускает посмертную отладку для указанного объекта *traceback*. Если объект *traceback* не указан, используется объект traceback текущего обрабатываемого исключения (исключение должно обрабатываться, чтобы значение по умолчанию сработало).9293#### `pdb.pm()`9495Запускает посмертную отладку для traceback, найденного в [`sys.last_traceback`](https://python-all.ru/3.6/library/sys.html#sys.last_traceback).9697Функции `run*` и [`set_trace()`](https://python-all.ru/3.6/library/pdb.html#pdb.set_trace) являются псевдонимами для создания экземпляра класса [`Pdb`](https://python-all.ru/3.6/library/pdb.html#pdb.Pdb) и вызова одноимённого метода. Если требуется доступ к дополнительным возможностям, это нужно сделать самостоятельно:9899#### `class pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False, readrc=True)`100101[`Pdb`](https://python-all.ru/3.6/library/pdb.html#pdb.Pdb) – это класс отладчика.102103Аргументы *completekey*, *stdin* и *stdout* передаются базовому классу [`cmd.Cmd`](https://python-all.ru/3.6/library/cmd.html#cmd.Cmd); см. описание там.104105Аргумент *skip*, если задан, должен быть итерабельным с шаблонами имён модулей в стиле glob. Отладчик не будет входить в фреймы, происходящие из модуля, который соответствует одному из этих шаблонов. [1](https://python-all.ru/3.6/library/pdb.html#id3)106107По умолчанию Pdb устанавливает обработчик сигнала SIGINT (который отправляется, когда пользователь нажимает `Ctrl-C` на консоли) при вводе команды `continue`. Это позволяет снова войти в отладчик, нажав `Ctrl-C`. Если требуется, чтобы Pdb не изменял обработчик SIGINT, установите *nosigint* в значение true.108109Аргумент *readrc* по умолчанию равен true и определяет, будет ли Pdb загружать файлы .pdbrc из файловой системы.110111Пример вызова для включения трассировки с *skip*:112113```python114import pdb; pdb.Pdb(skip=['django.*']).set_trace()115```116117Новое в версии 3.1: аргумент *skip*.118119Новое в версии 3.2: Аргумент *nosigint*. Ранее обработчик SIGINT никогда не устанавливался Pdb.120121Изменено в версии 3.6: Добавлен аргумент *readrc*.122123#### `run(statement, globals=None, locals=None)`124125#### `runeval(expression, globals=None, locals=None)`126127#### `runcall(function, *args, **kwds)`128129#### `set_trace()`130131См. документацию по функциям, описанным выше.132133## 27.3.1. Команды отладчика134135Команды, распознаваемые отладчиком, перечислены ниже. Большинство команд можно сократить до одной или двух букв, как указано; например, `h(elp)` означает, что для ввода команды help можно использовать `h` или `help` (но не `he` или `hel`, а также не `H` или `Help` или `HELP`). Аргументы команд должны разделяться пробельными символами (пробелами или табуляцией). Необязательные аргументы заключаются в квадратные скобки (`[]`) в синтаксисе команды; сами скобки вводить не нужно. Альтернативы в синтаксисе команды разделяются вертикальной чертой (`|`).136137Ввод пустой строки повторяет последнюю введённую команду. Исключение: если последней командой была [`list`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-list), то будут выведены следующие 11 строк.138139Команды, которые отладчик не распознает, считаются операторами Python и выполняются в контексте отлаживаемой программы. Операторы Python также можно начинать с восклицательного знака (`!`). Это мощный способ исследовать отлаживаемую программу; можно даже изменить переменную или вызвать функцию. Если в таком операторе возникает исключение, выводится его имя, но состояние отладчика не меняется.140141Отладчик поддерживает [псевдонимы](https://python-all.ru/3.6/library/pdb.html#debugger-aliases). Псевдонимы могут иметь параметры, что обеспечивает некоторую гибкость в зависимости от контекста.142143Несколько команд можно ввести в одной строке, разделив их `;;`. (Одиночный `;` не используется, так как он является разделителем для нескольких команд в строке, передаваемой парсеру Python.) При разделении команд не применяется никакая интеллектуальная обработка; входная строка разбивается по первой паре `;;`, даже если она находится внутри строки в кавычках.144145Если файл `.pdbrc` существует в домашнем каталоге пользователя или в текущем каталоге, он читается и выполняется так, как если бы он был введён в приглашении отладчика. Это особенно полезно для псевдонимов. Если оба файла существуют, сначала читается файл из домашнего каталога, и псевдонимы, определённые в нём, могут быть переопределены локальным файлом.146147Изменено в версии 3.2: `.pdbrc` теперь может содержать команды, продолжающие отладку, например [`continue`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-continue) или [`next`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-next). Ранее эти команды не действовали.148149**`h(elp)``[command]`**150151Без аргументов выводит список доступных команд. С аргументом *команда* выводит справку по этой команде. `help pdb` отображает полную документацию (docstring модуля [`pdb`](https://python-all.ru/3.6/library/pdb.html#module-pdb)). Поскольку аргумент *команда* должен быть идентификатором, для получения справки по команде `!` необходимо ввести `help exec`.152153**`w(here)`**154155Печатает трассировку стека, причём самый новый фрейм находится внизу. Стрелка указывает на текущий фрейм, который определяет контекст большинства команд.156157**`d(own)``[count]`**158159Переместить текущий кадр на *count* (по умолчанию один) уровней вниз по трассировке стека (к более новому кадру).160161**`u(p)``[count]`**162163Переместить текущий кадр на *count* (по умолчанию один) уровней вверх по трассировке стека (к более старому кадру).164165**`b(reak)``[([filename:]lineno | function) [, condition]]`**166167С аргументом *lineno* устанавливает точку остановки в текущем файле на указанной строке. С аргументом *function* устанавливает точку остановки на первом исполняемом операторе внутри этой функции. Номер строки может быть предварён именем файла и двоеточием, чтобы указать точку остановки в другом файле (возможно, ещё не загруженном). Файл ищется в [`sys.path`](https://python-all.ru/3.6/library/sys.html#sys.path). Обратите внимание: каждой точке остановки присваивается номер, на который ссылаются все остальные команды управления точками остановки.168169Если присутствует второй аргумент, это выражение, которое должно вычисляться в true (истина), чтобы точка останова сработала.170171Без аргумента выводит список всех точек останова, включая для каждой точки останова количество срабатываний, текущий счётчик игнорирования и связанное условие, если оно есть.172173**`tbreak``[([filename:]lineno | function) [, condition]]`**174175Временная точка останова, которая удаляется автоматически при первом срабатывании. Аргументы такие же, как для [`break`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-break).176177**`cl(ear)``[filename:lineno | bpnumber [bpnumber ...]]`**178179С аргументом *filename:lineno* удаляет все точки останова на этой строке. С разделённым пробелами списком номеров точек останова удаляет указанные точки останова. Без аргумента удаляет все точки останова (но сначала запрашивает подтверждение).180181**`disable``[bpnumber [bpnumber ...]]`**182183Отключает точки останова, заданные разделённым пробелами списком номеров точек останова. Отключение точки останова означает, что она не может приостановить выполнение программы, но в отличие от удаления точки останова, она остаётся в списке точек останова и может быть (повторно) включена.184185**`enable``[bpnumber [bpnumber ...]]`**186187Включает указанные точки останова.188189**`ignore``bpnumber [count]`**190191Устанавливает счётчик игнорирования для заданного номера точки останова. Если счётчик не указан, счётчик игнорирования устанавливается в 0. Точка останова становится активной, когда счётчик игнорирования равен нулю. Если он не равен нулю, счётчик уменьшается каждый раз, когда точка останова достигается, и она не отключена, и любое связанное с ней условие истинно.192193**`condition``bpnumber [condition]`**194195Устанавливает новое *condition* для точки останова – выражение, которое должно вычисляться в true, чтобы точка останова сработала. Если *condition* отсутствует, любое существующее условие удаляется; т.е. точка останова становится безусловной.196197**`commands``[bpnumber]`**198199Задаёт список команд для точки останова с номером *bpnumber*. Сами команды вводятся на следующих строках. Введите строку, содержащую только `end`, чтобы завершить список команд. Пример:200201```python202(Pdb) commands 1203(com) p some_variable204(com) end205(Pdb)206```207208Чтобы удалить все команды из точки останова, введите команду commands и сразу же после неё укажите `end`; то есть не задавайте никаких команд.209210Без аргумента *bpnumber* команда commands относится к последней установленной точке останова.211212Можно использовать команды точки останова, чтобы снова запустить программу. Просто используйте команду continue, или step, или любую другую команду, возобновляющую выполнение.213214Указание любой команды, возобновляющей выполнение (в настоящее время continue, step, next, return, jump, quit и их сокращения), завершает список команд (как если бы за этой командой сразу следовало end). Это связано с тем, что при каждом возобновлении выполнения (даже с помощью простого next или step) может встретиться другая точка останова – у которой может быть свой список команд, что приводит к неоднозначности относительно того, какой список выполнять.215216Если в списке команд используется команда ‘silent’, обычное сообщение об остановке на точке останова не выводится. Это может быть удобно для точек останова, которые должны выводить определённое сообщение и затем продолжать. Если никакие другие команды ничего не выводят, вы не увидите признака того, что точка останова была достигнута.217218**`s(tep)`**219220Выполняет текущую строку, останавливается при первой возможности (либо в вызываемой функции, либо на следующей строке в текущей функции).221222**`n(ext)`**223224Продолжает выполнение до следующей строки в текущей функции или до её возврата. (Разница между [`next`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-next) и [`step`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-step) в том, что [`step`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-step) останавливается внутри вызванной функции, тогда как [`next`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-next) выполняет вызванные функции (почти) на полной скорости, останавливаясь только на следующей строке в текущей функции.)225226**`unt(il)``[lineno]`**227228Без аргумента продолжает выполнение до строки с номером, большим текущего.229230С номером строки продолжает выполнение до достижения строки с номером, большим или равным указанному. В обоих случаях также останавливается при возврате из текущего фрейма.231232Изменено в версии 3.2: Добавлена возможность явно указывать номер строки.233234**`r(eturn)`**235236Продолжает выполнение до возврата текущей функции.237238**`c(ont(inue))`**239240Продолжает выполнение, останавливаясь только при встрече точки останова.241242**`j(ump)``lineno`**243244Устанавливает следующую строку для выполнения. Доступно только в самом нижнем фрейме. Это позволяет вернуться назад и выполнить код снова, или перейти вперёд, пропустив ненужный код.245246Следует отметить, что не все переходы разрешены – например, нельзя перейти внутрь цикла [`for`](https://python-all.ru/3.6/reference/compound_stmts.html#for) или выйти из конструкции [`finally`](https://python-all.ru/3.6/reference/compound_stmts.html#finally).247248**`l(ist)``[first[, last]]`**249250Выводит исходный код текущего файла. Без аргументов выводит 11 строк вокруг текущей строки или продолжает предыдущий вывод. С `.` в качестве аргумента выводит 11 строк вокруг текущей строки. С одним аргументом выводит 11 строк вокруг указанной строки. С двумя аргументами выводит заданный диапазон; если второй аргумент меньше первого, он интерпретируется как количество.251252Текущая строка в текущем фрейме помечается `->`. Если отлаживается исключение, строка, где оно было первоначально вызвано или распространено, помечается `>>`, если она отличается от текущей.253254Новое в версии 3.2: Маркер `>>`.255256**`ll``| longlist`**257258Выводит весь исходный код текущей функции или фрейма. Интересные строки помечаются так же, как для [`list`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-list).259260Новое в версии 3.2.261262**`a(rgs)`**263264Печатает список аргументов текущей функции.265266**`p``expression`**267268Вычисляет *выражение* в текущем контексте и выводит его значение.269270> **Примечание**271>272> `print()` также можно использовать, но это не команда отладчика – выполняется функция Python [`print()`](https://python-all.ru/3.6/library/functions.html#print).273274**`pp``expression`**275276Как команда [`p`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-p), за исключением того, что значение выражения выводится в удобном формате с помощью модуля [`pprint`](https://python-all.ru/3.6/library/pprint.html#module-pprint).277278**`whatis``expression`**279280Выводит тип *выражения*.281282**`source``expression`**283284Пытается получить исходный код для указанного объекта и отобразить его.285286Новое в версии 3.2.287288**`display``[expression]`**289290Отображает значение выражения, если оно изменилось, каждый раз при остановке выполнения в текущем фрейме.291292Без выражения выводит список всех отображаемых выражений для текущего фрейма.293294Новое в версии 3.2.295296**`undisplay``[expression]`**297298Больше не отображает выражение в текущем фрейме. Без выражения очищает все отображаемые выражения для текущего фрейма.299300Новое в версии 3.2.301302**`interact`**303304Запускает интерактивный интерпретатор (с использованием модуля [`code`](https://python-all.ru/3.6/library/code.html#module-code)), чьё глобальное пространство имён содержит все (глобальные и локальные) имена, найденные в текущей области видимости.305306Новое в версии 3.2.307308**`alias``[name [command]]`**309310Создаёт псевдоним с именем *name*, который выполняет *команду*. Команда *не* должна заключаться в кавычки. Заменяемые параметры могут обозначаться как `%1`, `%2` и так далее, а `%*` заменяется всеми параметрами. Если команда не указана, показывается текущий псевдоним для *name*. Если аргументы не указаны, выводятся все псевдонимы.311312Псевдонимы могут быть вложенными и могут содержать всё, что можно ввести в приглашении pdb. Обратите внимание, что внутренние команды pdb *могут* быть переопределены псевдонимами. Такая команда затем скрывается, пока псевдоним не удалён. Псевдонимы рекурсивно применяются к первому слову командной строки; все остальные слова в строке остаются нетронутыми.313314В качестве примера – два полезных псевдонима (особенно если они помещены в файл `.pdbrc`):315316```python317# Вывести переменные экземпляра (использование "pi classInst")318alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])319# Вывести переменные экземпляра в self320alias ps pi self321```322323**`unalias``name`**324325Удаляет указанный псевдоним.326327**`!``statement`**328329Выполняет (однострочную) *инструкцию* в контексте текущего кадра стека. Восклицательный знак можно опустить, если первое слово инструкции не напоминает команду отладчика. Чтобы установить глобальную переменную, можно указать [`global`](https://python-all.ru/3.6/reference/simple_stmts.html#global) перед инструкцией присваивания в той же строке, например:330331```python332(Pdb) global list_options; list_options = ['-l']333(Pdb)334```335336**`run``[args ...]`**337338**`restart``[args ...]`**339340Перезапускает отлаживаемую программу Python. Если указан аргумент, он разбивается с помощью [`shlex`](https://python-all.ru/3.6/library/shlex.html#module-shlex), и результат используется как новый [`sys.argv`](https://python-all.ru/3.6/library/sys.html#sys.argv). История, точки останова, действия и параметры отладчика сохраняются. [`restart`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-restart) – это псевдоним для [`run`](https://python-all.ru/3.6/library/pdb.html#pdbcommand-run).341342**`q(uit)`**343344Выход из отладчика. Выполнение программы прерывается.345346Сноски347348**[1](https://python-all.ru/3.6/library/pdb.html#id1)**349350Принадлежность фрейма к определённому модулю определяется значением `__name__` в глобальных переменных фрейма.351