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

pdb.md

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

1> **Источник:** https://python-all.ru/3.3/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.3/library/pdb.html#module-pdb) – Отладчик Python89Модуль [`pdb`](https://python-all.ru/3.3/library/pdb.html#module-pdb) определяет интерактивный отладчик исходного кода для программ на Python. Он поддерживает установку (условных) точек останова и пошаговое выполнение на уровне строк исходного кода, просмотр стековых фреймов, вывод исходного кода и выполнение произвольного кода Python в контексте любого стекового фрейма. Также поддерживается посмертная отладка и возможность вызова под управлением программы.1011Отладчик расширяем – он фактически определён как класс [`Pdb`](https://python-all.ru/3.3/library/pdb.html#pdb.Pdb). В настоящее время это не документировано, но легко понять, прочитав исходный код. Интерфейс расширения использует модули [`bdb`](https://python-all.ru/3.3/library/bdb.html#module-bdb) и [`cmd`](https://python-all.ru/3.3/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Изменено в версии 3.3: Автодополнение по табуляции через модуль [`readline`](https://python-all.ru/3.3/library/readline.html#module-readline) доступно для команд и аргументов команд, например, текущие глобальные и локальные имена предлагаются в качестве аргументов команды `print`.2930`pdb.py` также можно вызвать как скрипт для отладки других скриптов. Например:3132```python33python3 -m pdb myscript.py34```3536При вызове в качестве скрипта pdb автоматически переходит в режим посмертной отладки, если отлаживаемая программа завершается аварийно. После посмертной отладки (или после нормального завершения программы) pdb перезапускает программу. Автоматический перезапуск сохраняет состояние pdb (например, точки останова) и в большинстве случаев полезнее, чем выход из отладчика при завершении программы.3738Новое в версии 3.2: `pdb.py` теперь принимает опцию `-c`, которая выполняет команды так, как если бы они были заданы в файле `.pdbrc`; см. [*Команды отладчика*](https://python-all.ru/3.3/library/pdb.html#debugger-commands).3940Обычный способ войти в отладчик из работающей программы – вставить4142```python43import pdb; pdb.set_trace()44```4546в том месте, где нужно войти в отладчик. После этого можно пошагово выполнять код, следующий за этим оператором, и продолжить выполнение без отладчика с помощью команды [`continue`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-continue).4748Типичное использование для анализа аварийно завершившейся программы:4950```python51>>> import pdb52>>> import mymodule53>>> mymodule.test()54Traceback (most recent call last):55  File "<stdin>", line 1, in ?56  File "./mymodule.py", line 4, in test57    test2()58  File "./mymodule.py", line 3, in test259    print(spam)60NameError: spam61>>> pdb.pm()62> ./mymodule.py(3)test2()63-> print(spam)64(Pdb)65```6667Модуль определяет следующие функции; каждая из них запускает отладчик немного по-своему:6869#### `pdb.run(statement, globals=None, locals=None)`7071Выполняет *statement* (заданный как строка или объект кода) под управлением отладчика. Приглашение отладчика появляется перед выполнением любого кода; можно установить точки останова и ввести [`continue`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-continue), или пошагово выполнить оператор с помощью [`step`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-step) или [`next`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-next) (все эти команды описаны ниже). Необязательные аргументы *globals* и *locals* задают окружение, в котором выполняется код; по умолчанию используется словарь модуля [`__main__`](https://python-all.ru/3.3/library/__main__.html#module-__main__). (См. описание встроенных функций [`exec()`](https://python-all.ru/3.3/library/functions.html#exec) или [`eval()`](https://python-all.ru/3.3/library/functions.html#eval).)7273#### `pdb.runeval(expression, globals=None, locals=None)`7475Вычисляет *expression* (заданное как строка или объект кода) под управлением отладчика. Когда [`runeval()`](https://python-all.ru/3.3/library/pdb.html#pdb.runeval) возвращает результат, она возвращает значение выражения. В остальном эта функция аналогична [`run()`](https://python-all.ru/3.3/library/pdb.html#pdb.run).7677#### `pdb.runcall(function, *args, **kwds)`7879Вызывает *function* (объект функции или метода, не строка) с заданными аргументами. Когда [`runcall()`](https://python-all.ru/3.3/library/pdb.html#pdb.runcall) возвращает результат, она возвращает то, что вернул вызов функции. Приглашение отладчика появляется сразу после входа в функцию.8081#### `pdb.set_trace()`8283Выполняет вход в отладчик на стековом фрейме вызвавшей функции. Это полезно для установки точки останова в заданном месте программы, даже если в остальном код не отлаживается (например, при ошибке утверждения).8485#### `pdb.post_mortem(traceback=None)`8687Запускает посмертную отладку для указанного объекта *traceback*. Если объект *traceback* не указан, используется объект traceback текущего обрабатываемого исключения (исключение должно обрабатываться, чтобы значение по умолчанию сработало).8889#### `pdb.pm()`9091Входит в режим посмертной отладки по трассировке, находящейся в [`sys.last_traceback`](https://python-all.ru/3.3/library/sys.html#sys.last_traceback).9293Функции `run*` и [`set_trace()`](https://python-all.ru/3.3/library/pdb.html#pdb.set_trace) являются псевдонимами для создания экземпляра класса [`Pdb`](https://python-all.ru/3.3/library/pdb.html#pdb.Pdb) и вызова метода с тем же именем. Если нужно получить доступ к дополнительным возможностям, придётся сделать это самостоятельно:9495#### `class pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False)`9697[`Pdb`](https://python-all.ru/3.3/library/pdb.html#pdb.Pdb) – это класс отладчика.9899Аргументы *completekey*, *stdin* и *stdout* передаются базовому классу [`cmd.Cmd`](https://python-all.ru/3.3/library/cmd.html#cmd.Cmd); см. описание там.100101Аргумент *skip*, если задан, должен быть итерабельным с шаблонами имён модулей в стиле glob. Отладчик не будет входить в фреймы, происходящие из модуля, который соответствует одному из этих шаблонов. [\[1\]](https://python-all.ru/3.3/library/pdb.html#id3)102103By default, Pdb sets a handler for the SIGINT signal (which is sent when the user presses Ctrl-C on the console) when you give a `continue` command. This allows you to break into the debugger again by pressing Ctrl-C. If you want Pdb not to touch the SIGINT handler, set *nosigint* tot true.104105Пример вызова для включения трассировки с *skip*:106107```python108import pdb; pdb.Pdb(skip=['django.*']).set_trace()109```110111Новое в версии 3.1: аргумент *skip*.112113Новое в версии 3.2: Аргумент *nosigint*. Ранее обработчик SIGINT никогда не устанавливался Pdb.114115#### `run(statement, globals=None, locals=None)`116117#### `runeval(expression, globals=None, locals=None)`118119#### `runcall(function, *args, **kwds)`120121#### `set_trace()`122123См. документацию по функциям, описанным выше.124125## 27.3.1. Команды отладчика126127Команды, распознаваемые отладчиком, перечислены ниже. Большинство команд можно сократить до одной или двух букв, как указано; например, `h(elp)` означает, что для ввода команды help можно использовать как `h`, так и `help` (но не `he` или `hel`, а также не `H`, `Help` или `HELP`). Аргументы команд должны разделяться пробельными символами (пробелами или табуляциями). Необязательные аргументы заключаются в квадратные скобки (`[]`) в синтаксисе команды; сами квадратные скобки вводить не нужно. Альтернативы в синтаксисе команды разделяются вертикальной чертой (`|`).128129Ввод пустой строки повторяет последнюю введённую команду. Исключение: если последней командой была [`list`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-list), то выводятся следующие 11 строк.130131Команды, которые отладчик не распознает, считаются операторами Python и выполняются в контексте отлаживаемой программы. Операторы Python также можно начинать с восклицательного знака (`!`). Это мощный способ исследовать отлаживаемую программу; можно даже изменить переменную или вызвать функцию. Если в таком операторе возникает исключение, выводится его имя, но состояние отладчика не меняется.132133Отладчик поддерживает [*псевдонимы*](https://python-all.ru/3.3/library/pdb.html#debugger-aliases). Псевдонимы могут иметь параметры, что обеспечивает некоторую гибкость в зависимости от контекста.134135Несколько команд можно ввести в одной строке, разделив их `;;`. (Одиночный `;` не используется, так как он является разделителем для нескольких команд в строке, передаваемой парсеру Python.) При разделении команд не применяется никакая интеллектуальная обработка; входная строка разбивается по первой паре `;;`, даже если она находится внутри строки в кавычках.136137Если файл `.pdbrc` существует в домашнем каталоге пользователя или в текущем каталоге, он считывается и выполняется так, как если бы он был введён в приглашении отладчика. Это особенно полезно для псевдонимов. Если существуют оба файла, сначала считывается файл из домашнего каталога, и определённые в нём псевдонимы могут быть переопределены локальным файлом.138139Изменено в версии 3.2: `.pdbrc` теперь может содержать команды, которые продолжают отладку, такие как [`continue`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-continue) или [`next`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-next). Ранее эти команды не действовали.140141**`h(elp)``[command]`**142143Без аргументов выводит список доступных команд. С аргументом *command* выводит справку об этой команде. `help pdb` выводит полную документацию (строку документации модуля [`pdb`](https://python-all.ru/3.3/library/pdb.html#module-pdb)). Поскольку аргумент *command* должен быть идентификатором, для получения справки по команде `!` необходимо ввести `help exec`.144145**`w(here)`**146147Печатает трассировку стека, причём самый новый фрейм находится внизу. Стрелка указывает на текущий фрейм, который определяет контекст большинства команд.148149**`d(own)``[count]`**150151Переместить текущий кадр на *count* (по умолчанию один) уровней вниз по трассировке стека (к более новому кадру).152153**`u(p)``[count]`**154155Переместить текущий кадр на *count* (по умолчанию один) уровней вверх по трассировке стека (к более старому кадру).156157**`b(reak)``[([filename:]lineno | function) [, condition]]`**158159С аргументом *lineno* устанавливает точку остановки на этой строке в текущем файле. С аргументом *function* устанавливает точку остановки на первом выполняемом операторе в этой функции. Номер строки может быть указан с префиксом имени файла и двоеточием, чтобы задать точку остановки в другом файле (возможно, ещё не загруженном). Файл ищется в [`sys.path`](https://python-all.ru/3.3/library/sys.html#sys.path). Обратите внимание, что каждой точке остановки присваивается номер, на который ссылаются все остальные команды для точек остановки.160161Если присутствует второй аргумент, это выражение, которое должно вычисляться в true (истина), чтобы точка останова сработала.162163Без аргумента выводит список всех точек останова, включая для каждой точки останова количество срабатываний, текущий счётчик игнорирования и связанное условие, если оно есть.164165**`tbreak``[([filename:]lineno | function) [, condition]]`**166167Временная точка остановки, которая удаляется автоматически при первом срабатывании. Аргументы те же, что и для [`break`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-break).168169**`cl(ear)``[filename:lineno | bpnumber [bpnumber ...]]`**170171С аргументом *filename:lineno* удаляет все точки останова на этой строке. С разделённым пробелами списком номеров точек останова удаляет указанные точки останова. Без аргумента удаляет все точки останова (но сначала запрашивает подтверждение).172173**`disable``[bpnumber [bpnumber ...]]`**174175Отключает точки останова, заданные разделённым пробелами списком номеров точек останова. Отключение точки останова означает, что она не может приостановить выполнение программы, но в отличие от удаления точки останова, она остаётся в списке точек останова и может быть (повторно) включена.176177**`enable``[bpnumber [bpnumber ...]]`**178179Включает указанные точки останова.180181**`ignore``bpnumber [count]`**182183Устанавливает счётчик игнорирования для заданного номера точки останова. Если счётчик не указан, счётчик игнорирования устанавливается в 0. Точка останова становится активной, когда счётчик игнорирования равен нулю. Если он не равен нулю, счётчик уменьшается каждый раз, когда точка останова достигается, и она не отключена, и любое связанное с ней условие истинно.184185**`condition``bpnumber [condition]`**186187Устанавливает новое *condition* для точки останова – выражение, которое должно вычисляться в true, чтобы точка останова сработала. Если *condition* отсутствует, любое существующее условие удаляется; т.е. точка останова становится безусловной.188189**`commands``[bpnumber]`**190191Задаёт список команд для точки остановки с номером *bpnumber*. Сами команды указываются на следующих строках. Введите строку, содержащую только `end`, чтобы завершить список команд. Пример:192193```python194(Pdb) commands 1195(com) print some_variable196(com) end197(Pdb)198```199200Чтобы удалить все команды из точки остановки, введите commands и сразу за ним `end`; то есть не указывайте никаких команд.201202Без аргумента *bpnumber* команда commands относится к последней установленной точке останова.203204Можно использовать команды точки останова, чтобы снова запустить программу. Просто используйте команду continue, или step, или любую другую команду, возобновляющую выполнение.205206Указание любой команды, возобновляющей выполнение (в настоящее время continue, step, next, return, jump, quit и их сокращения), завершает список команд (как если бы после этой команды сразу следовал end). Это связано с тем, что при каждом возобновлении выполнения (даже с помощью простого next или step) можно встретить другую точку остановки, у которой может быть свой список команд, что приводит к неоднозначности относительно того, какой список выполнять.207208Если в списке команд используется команда ‘silent’, обычное сообщение об остановке на точке останова не выводится. Это может быть удобно для точек останова, которые должны выводить определённое сообщение и затем продолжать. Если никакие другие команды ничего не выводят, вы не увидите признака того, что точка останова была достигнута.209210**`s(tep)`**211212Выполняет текущую строку, останавливается при первой возможности (либо в вызываемой функции, либо на следующей строке в текущей функции).213214**`n(ext)`**215216Продолжает выполнение до тех пор, пока не будет достигнута следующая строка в текущей функции или пока функция не вернётся. (Разница между [`next`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-next) и [`step`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-step) в том, что [`step`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-step) останавливается внутри вызванной функции, а [`next`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-next) выполняет вызванные функции (почти) на полной скорости, останавливаясь только на следующей строке в текущей функции.)217218**`unt(il)``[lineno]`**219220Без аргумента продолжает выполнение до строки с номером, большим текущего.221222С номером строки продолжает выполнение до достижения строки с номером, большим или равным указанному. В обоих случаях также останавливается при возврате из текущего фрейма.223224Изменено в версии 3.2: Добавлена возможность явно указывать номер строки.225226**`r(eturn)`**227228Продолжает выполнение до возврата текущей функции.229230**`c(ont(inue))`**231232Продолжает выполнение, останавливаясь только при встрече точки останова.233234**`j(ump)``lineno`**235236Устанавливает следующую строку для выполнения. Доступно только в самом нижнем фрейме. Это позволяет вернуться назад и выполнить код снова, или перейти вперёд, пропустив ненужный код.237238Следует отметить, что не все переходы разрешены – например, нельзя перейти в середину цикла [`for`](https://python-all.ru/3.3/reference/compound_stmts.html#for) или выйти из блока [`finally`](https://python-all.ru/3.3/reference/compound_stmts.html#finally).239240**`l(ist)``[first[, last]]`**241242Выводит исходный код текущего файла. Без аргументов выводит 11 строк вокруг текущей строки или продолжает предыдущий вывод. С `.` в качестве аргумента выводит 11 строк вокруг текущей строки. С одним аргументом выводит 11 строк вокруг указанной строки. С двумя аргументами выводит заданный диапазон; если второй аргумент меньше первого, он интерпретируется как количество.243244Текущая строка в текущем фрейме помечается `->`. Если отлаживается исключение, строка, где оно было первоначально вызвано или распространено, помечается `>>`, если она отличается от текущей.245246Новое в версии 3.2: Маркер `>>`.247248**`ll``| longlist`**249250Выводит весь исходный код текущей функции или фрейма. Интересные строки помечаются так же, как для [`list`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-list).251252Новое в версии 3.2.253254**`a(rgs)`**255256Печатает список аргументов текущей функции.257258**`p(rint)``expression`**259260Вычисляет *выражение* в текущем контексте и выводит его значение.261262**`pp``expression`**263264Как команда [`print`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-print), но значение выражения красиво печатается с помощью модуля [`pprint`](https://python-all.ru/3.3/library/pprint.html#module-pprint).265266**`whatis``expression`**267268Выводит тип *выражения*.269270**`source``expression`**271272Пытается получить исходный код для указанного объекта и отобразить его.273274Новое в версии 3.2.275276**`display``[expression]`**277278Отображает значение выражения, если оно изменилось, каждый раз при остановке выполнения в текущем фрейме.279280Без выражения выводит список всех отображаемых выражений для текущего фрейма.281282Новое в версии 3.2.283284**`undisplay``[expression]`**285286Больше не отображает выражение в текущем фрейме. Без выражения очищает все отображаемые выражения для текущего фрейма.287288Новое в версии 3.2.289290**`interact`**291292Запускает интерактивный интерпретатор (с помощью модуля [`code`](https://python-all.ru/3.3/library/code.html#module-code)), глобальное пространство имён которого содержит все (глобальные и локальные) имена, найденные в текущей области видимости.293294Новое в версии 3.2.295296**`alias``[name [command]]`**297298Создаёт псевдоним с именем *name*, который выполняет *команду*. Команда *не* должна заключаться в кавычки. Заменяемые параметры могут обозначаться как `%1`, `%2` и так далее, а `%*` заменяется всеми параметрами. Если команда не указана, показывается текущий псевдоним для *name*. Если аргументы не указаны, выводятся все псевдонимы.299300Псевдонимы могут быть вложенными и могут содержать всё, что можно ввести в приглашении pdb. Обратите внимание, что внутренние команды pdb *могут* быть переопределены псевдонимами. Такая команда затем скрывается, пока псевдоним не удалён. Псевдонимы рекурсивно применяются к первому слову командной строки; все остальные слова в строке остаются нетронутыми.301302В качестве примера, вот два полезных псевдонима (особенно если поместить их в файл `.pdbrc`):303304```python305# Вывести переменные экземпляра (использование "pi classInst")306alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])307# Вывести переменные экземпляра в self308alias ps pi self309```310311**`unalias``name`**312313Удаляет указанный псевдоним.314315**`!``statement`**316317Выполняет (однострочную) *инструкцию* в контексте текущего кадра стека. Восклицательный знак можно опустить, если первое слово инструкции не похоже на команду отладчика. Чтобы задать глобальную переменную, можно добавить оператор [`global`](https://python-all.ru/3.3/reference/simple_stmts.html#global) перед командой присваивания в той же строке, например:318319```python320(Pdb) global list_options; list_options = ['-l']321(Pdb)322```323324**`run``[args ...]`**325326**`restart``[args ...]`**327328Перезапускает отлаживаемую программу Python. Если указан аргумент, он разбивается с помощью [`shlex`](https://python-all.ru/3.3/library/shlex.html#module-shlex), и результат используется как новый [`sys.argv`](https://python-all.ru/3.3/library/sys.html#sys.argv). История, точки останова, действия и параметры отладчика сохраняются. [`restart`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-restart) является псевдонимом для [`run`](https://python-all.ru/3.3/library/pdb.html#pdbcommand-run).329330**`q(uit)`**331332Выход из отладчика. Выполнение программы прерывается.333334Сноски335336| [\[1\]](https://python-all.ru/3.3/library/pdb.html#id1) | Считается ли кадр происходящим из определённого модуля, определяется по `__name__` в глобальных переменных кадра. |337| --- | --- |338