pdb.md
1> **Источник:** https://python-all.ru/2.7/library/pdb.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 26.2. [`pdb`](https://python-all.ru/2.7/library/pdb.html#module-pdb) – Отладчик Python89**Исходный код:** [Lib/pdb.py](https://python-all.ru/src/2.7/Lib/pdb.py)1011---1213Модуль [`pdb`](https://python-all.ru/2.7/library/pdb.html#module-pdb) определяет интерактивный отладчик исходного кода для программ на Python. Он поддерживает установку (условных) точек останова и пошаговое исполнение на уровне строк исходного кода, просмотр стековых фреймов, отображение исходного кода и выполнение произвольного кода Python в контексте любого фрейма. Также поддерживается посмертная отладка, и его можно вызывать программно.1415Отладчик является расширяемым – фактически он определён как класс [`Pdb`](https://python-all.ru/2.7/library/pdb.html#pdb.Pdb). В настоящее время это не документировано, но легко понять, прочитав исходный код. Интерфейс расширения использует модули [`bdb`](https://python-all.ru/2.7/library/bdb.html#module-bdb) и [`cmd`](https://python-all.ru/2.7/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`pdb.py` также можно вызвать как скрипт для отладки других скриптов. Например:3334```python35python -m pdb myscript.py36```3738При запуске как скрипта pdb автоматически переходит в режим посмертной отладки, если отлаживаемая программа завершается аварийно. После посмертной отладки (или после нормального завершения программы) pdb перезапускает программу. Автоматический перезапуск сохраняет состояние pdb (например, точки останова) и в большинстве случаев полезнее, чем выход из отладчика при завершении программы.3940Новое в версии 2.4: Добавлено поведение повторного запуска после аварийного завершения.4142Обычный способ войти в отладчик из работающей программы – вставить4344```python45import pdb; pdb.set_trace()46```4748В месте, где нужно войти в отладчик. Затем можно пошагово выполнять код, следующий за этой инструкцией, и продолжить выполнение без отладчика с помощью команды `c`.4950Типичное использование для анализа аварийно завершившейся программы:5152```python53>>> import pdb54>>> import mymodule55>>> mymodule.test()56Traceback (most recent call last):57 File "<stdin>", line 1, in <module>58 File "./mymodule.py", line 4, in test59 test2()60 File "./mymodule.py", line 3, in test261 print spam62NameError: spam63>>> pdb.pm()64> ./mymodule.py(3)test2()65-> print spam66(Pdb)67```6869Модуль определяет следующие функции; каждая из них запускает отладчик немного по-своему:7071#### `pdb.run(statement[, globals[, locals]])`7273Выполняет *инструкцию* (заданную в виде строки) под управлением отладчика. Приглашение отладчика появляется перед выполнением любого кода; можно установить точки останова и ввести `continue`, или выполнять инструкцию по шагам с помощью `step` или `next` (все эти команды описаны ниже). Необязательные аргументы *globals* и *locals* задают окружение, в котором выполняется код; по умолчанию используется словарь модуля [`__main__`](https://python-all.ru/2.7/library/__main__.html#module-__main__). (См. описание инструкции [`exec`](https://python-all.ru/2.7/reference/simple_stmts.html#exec) или встроенной функции [`eval()`](https://python-all.ru/2.7/library/functions.html#eval).)7475#### `pdb.runeval(expression[, globals[, locals]])`7677Вычисляет *выражение* (заданное в виде строки) под управлением отладчика. Когда [`runeval()`](https://python-all.ru/2.7/library/pdb.html#pdb.runeval) возвращает управление, она возвращает значение выражения. В остальном эта функция аналогична [`run()`](https://python-all.ru/2.7/library/pdb.html#pdb.run).7879#### `pdb.runcall(function[, argument, ...])`8081Вызывает *функцию* (объект функции или метода, а не строку) с заданными аргументами. Когда [`runcall()`](https://python-all.ru/2.7/library/pdb.html#pdb.runcall) возвращает управление, она возвращает то, что вернул вызов функции. Приглашение отладчика появляется сразу после входа в функцию.8283#### `pdb.set_trace()`8485Выполняет вход в отладчик на стековом фрейме вызвавшей функции. Это полезно для установки точки останова в заданном месте программы, даже если в остальном код не отлаживается (например, при ошибке утверждения).8687#### `pdb.post_mortem([traceback])`8889Запускает посмертную отладку для указанного объекта *traceback*. Если объект *traceback* не указан, используется объект traceback текущего обрабатываемого исключения (исключение должно обрабатываться, чтобы значение по умолчанию сработало).9091#### `pdb.pm()`9293Запускает посмертную отладку для traceback, найденного в [`sys.last_traceback`](https://python-all.ru/2.7/library/sys.html#sys.last_traceback).9495Функции `run*` и [`set_trace()`](https://python-all.ru/2.7/library/pdb.html#pdb.set_trace) являются псевдонимами для создания экземпляра класса [`Pdb`](https://python-all.ru/2.7/library/pdb.html#pdb.Pdb) и вызова одноимённого метода. Если требуется доступ к дополнительным возможностям, это нужно сделать самостоятельно:9697#### `class pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None)`9899[`Pdb`](https://python-all.ru/2.7/library/pdb.html#pdb.Pdb) – это класс отладчика.100101Аргументы *completekey*, *stdin* и *stdout* передаются базовому классу [`cmd.Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd); см. описание там.102103Аргумент *skip*, если задан, должен быть итерабельным с шаблонами имён модулей в стиле glob. Отладчик не будет входить в фреймы, происходящие из модуля, который соответствует одному из этих шаблонов. [1](https://python-all.ru/2.7/library/pdb.html#id3)104105Пример вызова для включения трассировки с *skip*:106107```python108import pdb; pdb.Pdb(skip=['django.*']).set_trace()109```110111Новое в версии 2.7: Аргумент *skip*.112113#### `run(statement[, globals[, locals]])`114115#### `runeval(expression[, globals[, locals]])`116117#### `runcall(function[, argument, ...])`118119#### `set_trace()`120121См. документацию по функциям, описанным выше.122123# 26.3. Команды отладчика124125Отладчик распознаёт следующие команды. Большинство команд можно сократить до одной или двух букв; например, `h(elp)` означает, что для ввода команды help можно использовать `h` или `help` (но не `he` или `hel`, а также не `H`, `Help` или `HELP`). Аргументы команд должны разделяться пробельными символами (пробелами или табуляцией). Необязательные аргументы заключаются в квадратные скобки (`[]`) в синтаксисе команды; сами квадратные скобки вводить не нужно. Альтернативы в синтаксисе команды разделяются вертикальной чертой (`|`).126127Ввод пустой строки повторяет последнюю введённую команду. Исключение: если последней командой была `list`, то будут выведены следующие 11 строк.128129Команды, которые отладчик не распознает, считаются операторами Python и выполняются в контексте отлаживаемой программы. Операторы Python также можно начинать с восклицательного знака (`!`). Это мощный способ исследовать отлаживаемую программу; можно даже изменить переменную или вызвать функцию. Если в таком операторе возникает исключение, выводится его имя, но состояние отладчика не меняется.130131Несколько команд можно ввести в одной строке, разделив их точкой с запятой `;;`. (Одиночная `;` не используется, так как она является разделителем для нескольких команд в строке, передаваемой парсеру Python.) Никакой интеллектуальный анализ при разделении команд не применяется; входная строка разбивается по первой `;;` паре, даже если она находится внутри строки в кавычках.132133Отладчик поддерживает псевдонимы. Псевдонимы могут иметь параметры, что обеспечивает определённый уровень адаптируемости к контексту исследования.134135Если файл `.pdbrc` существует в домашнем каталоге пользователя или в текущем каталоге, он читается и выполняется так, как если бы он был введён в приглашении отладчика. Это особенно полезно для псевдонимов. Если существуют оба файла, сначала читается файл из домашнего каталога, и определённые в нём псевдонимы могут быть переопределены локальным файлом.136137**h(elp) \[*команда*\]**138139Без аргумента выводит список доступных команд. С аргументом *команда* выводит справку по этой команде. `help pdb` отображает полный файл документации; если определена переменная окружения `PAGER`, файл передаётся через эту команду. Поскольку аргумент *команда* должен быть идентификатором, для получения справки по команде `!` необходимо ввести `help exec`.140141**w(here)**142143Печатает трассировку стека, причём самый новый фрейм находится внизу. Стрелка указывает на текущий фрейм, который определяет контекст большинства команд.144145**d(own)**146147Перемещает текущий кадр на один уровень вниз по стеку вызовов (к более новому кадру).148149**u(p)**150151Перемещает текущий кадр на один уровень вверх по стеку вызовов (к более старому кадру).152153**b(reak) \[\[*имя\_файла*:\]*номер\_строки* | *функция*\[, *условие*\]\]**154155С аргументом *номер строки* устанавливает точку останова в текущем файле на этой строке. С аргументом *функция* устанавливает точку останова на первой исполняемой инструкции внутри этой функции. Номер строки может быть предварён именем файла и двоеточием для указания точки останова в другом файле (возможно, ещё не загруженном). Файл ищется в `sys.path`. Обратите внимание, что каждой точке останова присваивается номер, на который ссылаются все остальные команды для точек останова.156157Если присутствует второй аргумент, это выражение, которое должно быть истинным, прежде чем точка останова сработает.158159Без аргументов выводит список всех точек останова, включая для каждой из них количество срабатываний, текущий счётчик игнорирования и связанное условие, если есть.160161**tbreak \[\[*имя\_файла*:\]*номер\_строки* | *функция*\[, *условие*\]\]**162163Временная точка останова, которая автоматически удаляется при первом срабатывании. Аргументы те же, что и для break.164165**cl(ear) \[*filename:lineno* | *bpnumber* \[*bpnumber …*\]\]**166167С аргументом *filename:lineno* удаляет все точки останова на этой строке. С разделённым пробелами списком номеров точек останова удаляет указанные точки останова. Без аргумента удаляет все точки останова (но сначала запрашивает подтверждение).168169**disable \[*bpnumber* \[*bpnumber …*\]\]**170171Отключает точки останова, заданные в виде разделённого пробелами списка номеров. Отключение точки останова означает, что она не может остановить выполнение программы, но, в отличие от её удаления, она остаётся в списке точек останова и может быть (повторно) включена.172173**enable \[*bpnumber* \[*bpnumber …*\]\]**174175Включает указанные точки останова.176177**ignore *номер\_точки\_останова* \[*счётчик*\]**178179Устанавливает счётчик игнорирования для указанного номера точки останова. Если счётчик опущен, счётчик игнорирования устанавливается в 0. Точка останова становится активной, когда счётчик игнорирования равен нулю. Если он не равен нулю, счётчик уменьшается на 1 каждый раз при достижении точки останова, при условии что она не отключена и любое связанное условие истинно.180181**condition *номер\_точки\_останова* \[*условие*\]**182183Условие – это выражение, которое должно быть истинным, прежде чем точка останова сработает. Если условие отсутствует, любое существующее условие удаляется; т.е. точка останова становится безусловной.184185**commands \[*номер\_точки\_останова*\]**186187Задаёт список команд для точки останова с номером *bpnumber*. Сами команды вводятся на следующих строках. Введите строку, содержащую только ‘end’, чтобы завершить список команд. Пример:188189```python190(Pdb) commands 1191(com) print some_variable192(com) end193(Pdb)194```195196Чтобы удалить все команды из точки останова, введите commands и сразу за ним end; то есть не вводите никаких команд.197198Без аргумента *bpnumber* команда commands относится к последней установленной точке останова.199200Можно использовать команды точки останова для перезапуска программы. Просто используйте команду continue, step или любую другую команду, возобновляющую выполнение.201202Указание любой команды, возобновляющей выполнение (в настоящее время continue, step, next, return, jump, quit и их сокращения), завершает список команд (как если бы за этой командой сразу следовало end). Это связано с тем, что при каждом возобновлении выполнения (даже с помощью простого next или step) может встретиться другая точка останова – у которой может быть свой список команд, что приводит к неоднозначности относительно того, какой список выполнять.203204Если в списке команд используется команда ‘silent’, обычное сообщение об остановке на точке останова не выводится. Это может быть удобно для точек останова, которые должны выводить определённое сообщение и затем продолжать. Если никакие другие команды ничего не выводят, вы не увидите признака того, что точка останова была достигнута.205206Новое в версии 2.5.207208**s(tep)**209210Выполняет текущую строку, останавливается при первой возможности (либо в вызываемой функции, либо на следующей строке в текущей функции).211212**n(ext)**213214Продолжает выполнение до достижения следующей строки в текущей функции или до её возврата. (Разница между `next` и `step` в том, что `step` останавливается внутри вызываемой функции, тогда как `next` выполняет вызываемые функции (почти) с полной скоростью, останавливаясь только на следующей строке в текущей функции.)215216**unt(il)**217218Продолжает выполнение до строки с номером, большим текущего, или до возврата из текущего фрейма.219220Новое в версии 2.6.221222**r(eturn)**223224Продолжает выполнение до возврата текущей функции.225226**c(ont(inue))**227228Продолжает выполнение, останавливаясь только при встрече точки останова.229230**j(ump) *номер\_строки***231232Устанавливает следующую строку, которая будет выполнена. Доступно только в самом нижнем фрейме. Это позволяет перепрыгнуть назад и выполнить код снова, или перепрыгнуть вперёд, пропуская код, который не требуется выполнять.233234Следует отметить, что разрешены не все переходы – например, невозможно перейти в середину цикла [`for`](https://python-all.ru/2.7/reference/compound_stmts.html#for) или выйти за пределы предложения [`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally).235236**l(ist) \[*первая*\[, *последняя*\]\]**237238Выводит исходный код текущего файла. Без аргументов выводит 11 строк вокруг текущей строки или продолжает предыдущий вывод. С одним аргументом выводит 11 строк вокруг указанной строки. С двумя аргументами выводит заданный диапазон; если второй аргумент меньше первого, он интерпретируется как количество строк.239240**a(rgs)**241242Печатает список аргументов текущей функции.243244**p *выражение***245246Вычисляет *выражение* в текущем контексте и выводит его значение.247248> **Примечание**249>250> `print` также может использоваться, но это не команда отладчика – выполняется инструкция Python [`print`](https://python-all.ru/2.7/reference/simple_stmts.html#print).251252**pp *выражение***253254Как и команда `p`, за исключением того, что значение выражения красиво выводится с помощью модуля [`pprint`](https://python-all.ru/2.7/library/pprint.html#module-pprint).255256**alias \[*имя* \[команда\]\]**257258Создаёт псевдоним с именем *name*, который выполняет *команду*. Команда *не* должна заключаться в кавычки. Заменяемые параметры можно обозначать с помощью `%1`, `%2` и так далее, а `%*` заменяется всеми параметрами. Если команда не указана, показывается текущий псевдоним для *name*. Если аргументы не указаны, выводятся все псевдонимы.259260Псевдонимы могут быть вложенными и могут содержать всё, что можно законно ввести в приглашении pdb. Обратите внимание, что внутренние команды pdb *могут* быть переопределены псевдонимами. Такая команда становится скрытой, пока псевдоним не будет удалён. Псевдонимизация рекурсивно применяется к первому слову командной строки; все остальные слова в строке остаются без изменений.261262В качестве примера – два полезных псевдонима (особенно если они помещены в файл `.pdbrc`):263264```python265#Вывести переменные экземпляра (использование "pi classInst")266alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]267#Вывести переменные экземпляра в self268alias ps pi self269```270271**unalias *имя***272273Удаляет указанный псевдоним.274275**\[!\]*инструкция***276277Выполняет (однострочную) *инструкцию* в контексте текущего стекового кадра. Восклицательный знак можно опустить, если только первое слово инструкции не напоминает команду отладчика. Чтобы установить глобальную переменную, можно предварить команду присваивания командой `global` на той же строке, например:278279```python280(Pdb) global list_options; list_options = ['-l']281(Pdb)282```283284**run \[*аргументы* …\]**285286Перезапускает отлаживаемую программу Python. Если указан аргумент, он разбивается с помощью “shlex”, и результат используется как новый sys.argv. История, точки останова, действия и параметры отладчика сохраняются. “restart” – псевдоним для “run”.287288Новое в версии 2.6.289290**q(uit)**291292Выход из отладчика. Выполняемая программа прерывается.293294Сноски295296**[1](https://python-all.ru/2.7/library/pdb.html#id1)**297298Принадлежность фрейма к определённому модулю определяется значением `__name__` в глобальных переменных фрейма.299