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

pdb.md

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

1> **Источник:** https://python-all.ru/3.0/library/pdb.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `pdb` – отладчик Python89Модуль `pdb` определяет интерактивный отладчик исходного кода для программ на Python. Он поддерживает установку (условных) точек останова и пошаговое выполнение на уровне строк исходного кода, просмотр стековых кадров, вывод исходного кода и выполнение произвольного кода Python в контексте любого стекового кадра. Также поддерживается посмертная отладка, и его можно вызывать из программы.1011Отладчик расширяем – на самом деле он определён как класс `Pdb`. В настоящее время он не документирован, но его легко понять, читая исходный код. Интерфейс расширения использует модули [`bdb`](https://python-all.ru/3.0/library/bdb.html#module-bdb) (недокументированный) и [`cmd`](https://python-all.ru/3.0/library/cmd.html#module-cmd).1213Приглашение отладчика – `(Pdb)`. Обычно для запуска программы под управлением отладчика используется:1415```python16>>> import pdb17>>> import mymodule18>>> pdb.run('mymodule.test()')19> <string>(0)?()20(Pdb) continue21> <string>(1)?()22(Pdb) continue23NameError: 'spam'24> <string>(1)?()25(Pdb)26```2728`pdb.py` также можно вызвать как скрипт для отладки других скриптов. Например:2930```python31python -m pdb myscript.py32```3334При запуске как скрипта pdb автоматически переходит в режим посмертной отладки, если отлаживаемая программа завершается аварийно. После посмертной отладки (или после нормального завершения программы) pdb перезапускает программу. Автоматический перезапуск сохраняет состояние pdb (например, точки останова) и в большинстве случаев полезнее, чем выход из отладчика при завершении программы.3536Типичный способ применения для анализа упавшей программы:3738```python39>>> import pdb40>>> import mymodule41>>> mymodule.test()42Traceback (most recent call last):43  File "<stdin>", line 1, in ?44  File "./mymodule.py", line 4, in test45    test2()46  File "./mymodule.py", line 3, in test247    print(spam)48NameError: spam49>>> pdb.pm()50> ./mymodule.py(3)test2()51-> print(spam)52(Pdb)53```5455Модуль определяет следующие функции; каждая из них запускает отладчик немного по-своему:5657#### `[pdb.run]pdb.run(statement[, globals[, locals]])`5859Выполняет6061*statement*6263(заданный строкой) под управлением отладчика. Приглашение отладчика появляется перед выполнением любого кода; можно установить точки останова и ввести6465`continue`6667, или выполнять оператор по шагам с помощью6869`step`7071или7273`next`7475(все эти команды описаны ниже). Необязательные аргументы7677*globals*7879и8081*locals*8283задают окружение, в котором выполняется код; по умолчанию используется словарь модуля8485[`__main__`](https://python-all.ru/3.0/library/__main__.html#module-__main__)8687. (См. описание встроенных функций8889[`exec()`](https://python-all.ru/3.0/library/functions.html#exec)9091или9293[`eval()`](https://python-all.ru/3.0/library/functions.html#eval)9495.)9697#### `[pdb.runeval]pdb.runeval(expression[, globals[, locals]])`9899Вычисляет100101*expression*102103(заданный строкой) под управлением отладчика. Когда104105[`runeval()`](https://python-all.ru/3.0/library/pdb.html#pdb.runeval)106107возвращает управление, возвращается значение выражения. В остальном эта функция аналогична108109[`run()`](https://python-all.ru/3.0/library/pdb.html#pdb.run)110111.112113#### `[pdb.runcall]pdb.runcall(function[, argument, ...])`114115Вызывает116117*function*118119(объект функции или метода, не строку) с указанными аргументами. Когда120121[`runcall()`](https://python-all.ru/3.0/library/pdb.html#pdb.runcall)122123возвращает управление, возвращается то, что вернул вызов функции. Приглашение отладчика появляется сразу после входа в функцию.124125#### `[pdb.set_trace]pdb.set_trace()`126127Выполняет вход в отладчик на стековом фрейме вызвавшей функции. Это полезно для установки точки останова в заданном месте программы, даже если в остальном код не отлаживается (например, при ошибке утверждения).128129#### `[pdb.post_mortem]pdb.post_mortem([traceback])`130131Запускает посмертную отладку для указанного объекта132133*traceback*134135. Если объект136137*traceback*138139не указан, используется объект traceback текущего обрабатываемого исключения (исключение должно обрабатываться, чтобы значение по умолчанию сработало).140141#### `[pdb.pm]pdb.pm()`142143Начать посмертную отладку для traceback, найденного в144145`sys.last_traceback`146147.148149# Команды отладчика150151Отладчик распознаёт следующие команды. Большинство команд можно сократить до одной или двух букв; например, `h(elp)` означает, что для ввода команды help можно использовать как `h`, так и `help` (но не `he` или `hel`, а также не `H`, `Help` или `HELP`). Аргументы команд должны разделяться пробельными символами (пробелами или табуляцией). Необязательные аргументы заключаются в квадратные скобки (`[]`) в синтаксисе команд; сами квадратные скобки вводить не нужно. Альтернативы в синтаксисе команд разделяются вертикальной чертой (`|`).152153Ввод пустой строки повторяет последнюю введённую команду. Исключение: если последней командой была `list`, то выводятся следующие 11 строк.154155Команды, которые отладчик не распознает, считаются операторами Python и выполняются в контексте отлаживаемой программы. Операторы Python также можно начинать с восклицательного знака (`!`). Это мощный способ исследовать отлаживаемую программу; можно даже изменить переменную или вызвать функцию. Если в таком операторе возникает исключение, выводится его имя, но состояние отладчика не меняется.156157Несколько команд можно ввести в одной строке, разделив их точкой с запятой `;;`. (Одиночная `;` не используется, так как она является разделителем для нескольких команд в строке, передаваемой парсеру Python.) Никакой интеллектуальный анализ при разделении команд не применяется; входная строка разбивается по первой `;;` паре, даже если она находится внутри строки в кавычках.158159Отладчик поддерживает псевдонимы. Псевдонимы могут иметь параметры, что обеспечивает определённый уровень адаптируемости к контексту исследования.160161Если файл `.pdbrc` существует в домашнем каталоге пользователя или в текущем каталоге, он читается и выполняется так, как если бы он был введён в приглашении отладчика. Это особенно полезно для псевдонимов. Если оба файла существуют, сначала читается файл из домашнего каталога, и определённые в нём псевдонимы могут быть переопределены локальным файлом.162163**h(elp) \[*команда*\]**164165Без аргумента выводит список доступных команд. С аргументом166167*command*168169выводит справку об этой команде.170171`help pdb`172173выводит полный файл документации; если определена переменная окружения174175**PAGER**176177, вывод направляется через эту команду. Поскольку аргумент178179*command*180181должен быть идентификатором, для получения справки по команде182183`!`184185необходимо ввести186187`help exec`188189.190191**w(here)**192193Печатает трассировку стека, причём самый новый фрейм находится внизу. Стрелка указывает на текущий фрейм, который определяет контекст большинства команд.194195**d(own)**196197Перемещает текущий кадр на один уровень вниз по стеку вызовов (к более новому кадру).198199**u(p)**200201Перемещает текущий кадр на один уровень вверх по стеку вызовов (к более старому кадру).202203**b(reak) \[\[*имя\_файла*:\]*номер\_строки* | *функция*\[, *условие*\]\]**204205С аргументом *номер\_строки* устанавливает точку останова в этой строке текущего файла. С аргументом *функция* устанавливает точку останова на первом исполняемом операторе внутри этой функции. Номер строки может быть указан с префиксом из имени файла и двоеточия, чтобы задать точку останова в другом файле (возможно, ещё не загруженном). Файл ищется в `sys.path`. Обратите внимание, что каждой точке останова присваивается номер, на который ссылаются все остальные команды для точек останова.206207Если присутствует второй аргумент, это выражение, которое должно быть истинным, прежде чем точка останова сработает.208209Без аргументов выводит список всех точек останова, включая для каждой из них количество срабатываний, текущий счётчик игнорирования и связанное условие, если есть.210211**tbreak \[\[*имя\_файла*:\]*номер\_строки* | *функция*\[, *условие*\]\]**212213Временная точка останова, которая автоматически удаляется при первом срабатывании. Аргументы те же, что и для break.214215**cl(ear) \[*bpnumber* \[*bpnumber ...*\]\]**216217Со списком номеров точек останова, разделённых пробелами, очищает эти точки останова. Без аргумента очищает все точки останова (но сначала запрашивает подтверждение).218219**disable \[*номер\_точки\_останова* \[*номер\_точки\_останова ...*\]\]**220221Отключает точки останова, заданные в виде разделённого пробелами списка номеров. Отключение точки останова означает, что она не может остановить выполнение программы, но, в отличие от её удаления, она остаётся в списке точек останова и может быть (повторно) включена.222223**enable \[*номер\_точки\_останова* \[*номер\_точки\_останова ...*\]\]**224225Включает указанные точки останова.226227**ignore *номер\_точки\_останова* \[*счётчик*\]**228229Устанавливает счётчик игнорирования для указанного номера точки останова. Если счётчик опущен, счётчик игнорирования устанавливается в 0. Точка останова становится активной, когда счётчик игнорирования равен нулю. Если он не равен нулю, счётчик уменьшается на 1 каждый раз при достижении точки останова, при условии что она не отключена и любое связанное условие истинно.230231**condition *номер\_точки\_останова* \[*условие*\]**232233Условие – это выражение, которое должно быть истинным, прежде чем точка останова сработает. Если условие отсутствует, любое существующее условие удаляется; т.е. точка останова становится безусловной.234235**commands \[*номер\_точки\_останова*\]**236237Задаёт список команд для точки останова с номером *bpnumber*. Сами команды вводятся на следующих строках. Введите строку, содержащую только ‘end’, чтобы завершить список команд. Пример:238239```python240(Pdb) commands 1241(com) print some_variable242(com) end243(Pdb)244```245246Чтобы удалить все команды из точки останова, введите commands и сразу за ним end; то есть не вводите никаких команд.247248Без аргумента *bpnumber* команда commands относится к последней установленной точке останова.249250Можно использовать команды точки останова для перезапуска программы. Просто используйте команду continue, step или любую другую команду, возобновляющую выполнение.251252Указание любой команды, возобновляющей выполнение (в настоящее время continue, step, next, return, jump, quit и их сокращения), завершает список команд (как если бы после этой команды сразу следовал end). Это связано с тем, что при каждом возобновлении выполнения (даже с помощью простого next или step) можно встретить другую точку остановки, у которой может быть свой список команд, что приводит к неоднозначности относительно того, какой список выполнять.253254Если в списке команд используется команда ‘silent’, обычное сообщение об остановке на точке останова не выводится. Это может быть удобно для точек останова, которые должны выводить определённое сообщение и затем продолжать. Если никакие другие команды ничего не выводят, вы не увидите признака того, что точка останова была достигнута.255256**s(tep)**257258Выполняет текущую строку, останавливается при первой возможности (либо в вызываемой функции, либо на следующей строке в текущей функции).259260**n(ext)**261262Продолжает выполнение до достижения следующей строки в текущей функции или до её возврата. (Разница между263264`next`265266и267268`step`269270в том, что271272`step`273274останавливается внутри вызванной функции, тогда как275276`next`277278выполняет вызванные функции (почти) на полной скорости, останавливаясь только на следующей строке в текущей функции.)279280**unt(il)**281282Продолжает выполнение до тех пор, пока не будет достигнута строка с номером, превышающим текущий, или при возврате из текущего фрейма.283284**r(eturn)**285286Продолжает выполнение до возврата текущей функции.287288**c(ont(inue))**289290Продолжает выполнение, останавливаясь только при встрече точки останова.291292**j(ump) *номер\_строки***293294Устанавливает следующую строку, которая будет выполнена. Доступно только в самом нижнем фрейме. Это позволяет перепрыгнуть назад и выполнить код снова, или перепрыгнуть вперёд, пропуская код, который не требуется выполнять.295296Следует учесть, что разрешены не все прыжки – например, невозможно перепрыгнуть в середину цикла [`for`](https://python-all.ru/3.0/reference/compound_stmts.html#for) или за пределы блока [`finally`](https://python-all.ru/3.0/reference/compound_stmts.html#finally).297298**l(ist) \[*первая*\[, *последняя*\]\]**299300Выводит исходный код текущего файла. Без аргументов выводит 11 строк вокруг текущей строки или продолжает предыдущий вывод. С одним аргументом выводит 11 строк вокруг указанной строки. С двумя аргументами выводит заданный диапазон; если второй аргумент меньше первого, он интерпретируется как количество строк.301302**a(rgs)**303304Печатает список аргументов текущей функции.305306**p(rint) *выражение***307308Вычисляет309310*выражение*311312в текущем контексте и выводит его значение.313314**pp *выражение***315316Подобно команде317318`p`319320, но значение выражения красиво выводится с помощью модуля321322[`pprint`](https://python-all.ru/3.0/library/pprint.html#module-pprint)323324.325326**alias \[*имя* \[команда\]\]**327328Создаёт псевдоним с именем *name*, который выполняет *команду*. Команда *не* должна заключаться в кавычки. Заменяемые параметры можно обозначать с помощью `%1`, `%2` и так далее, а `%*` заменяется всеми параметрами. Если команда не указана, показывается текущий псевдоним для *name*. Если аргументы не указаны, выводятся все псевдонимы.329330Псевдонимы могут быть вложенными и могут содержать всё, что можно законно ввести в приглашении pdb. Обратите внимание, что внутренние команды pdb *могут* быть переопределены псевдонимами. Такая команда становится скрытой, пока псевдоним не будет удалён. Псевдонимизация рекурсивно применяется к первому слову командной строки; все остальные слова в строке остаются без изменений.331332В качестве примера, вот два полезных псевдонима (особенно если поместить их в файл `.pdbrc`):333334```python335#Print instance variables (usage "pi classInst")336alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])337#Print instance variables in self338alias ps pi self339```340341**unalias *имя***342343Удаляет указанный псевдоним.344345**\[!\]*инструкция***346347Выполняет (однострочную) *инструкцию* в контексте текущего кадра стека. Восклицательный знак можно опустить, если первое слово инструкции не похоже на команду отладчика. Чтобы установить глобальную переменную, можно добавить перед командой присваивания команду `global` на той же строке, например:348349```python350(Pdb) global list_options; list_options = ['-l']351(Pdb)352```353354**run \[*аргументы* ...\]**355356Перезапускает отлаживаемую программу Python. Если указан аргумент, он разбивается с помощью “shlex”, и результат используется как новый sys.argv. История, точки останова, действия и параметры отладчика сохраняются. “restart” – это псевдоним для “run”.357358**q(uit)**359360Выход из отладчика. Выполняемая программа прерывается.361