bdb.md
1> **Источник:** https://python-all.ru/3.3/library/bdb.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 27.1. [`bdb`](https://python-all.ru/3.3/library/bdb.html#module-bdb) – Фреймворк отладчика89**Исходный код:** [Lib/bdb.py](https://python-all.ru/src/3.3/Lib/bdb.py)1011---1213Модуль [`bdb`](https://python-all.ru/3.3/library/bdb.html#module-bdb) обрабатывает базовые функции отладчика, такие как установка точек останова или управление выполнением через отладчик.1415Определено следующее исключение:1617#### `exception bdb.BdbQuit`1819Исключение, вызываемое классом [`Bdb`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb) для выхода из отладчика.2021Модуль [`bdb`](https://python-all.ru/3.3/library/bdb.html#module-bdb) также определяет два класса:2223#### `class bdb.Breakpoint(self, file, line, temporary=0, cond=None, funcname=None)`2425Этот класс реализует временные точки останова, счетчики игнорирования, отключение и (повторное) включение, а также условия.2627Точки останова индексируются по номеру через список `bpbynumber` и по парам `(file, line)` через `bplist`. Первый ссылается на единственный экземпляр класса [`Breakpoint`](https://python-all.ru/3.3/library/bdb.html#bdb.Breakpoint). Второй ссылается на список таких экземпляров, поскольку на одной строке может быть более одной точки останова.2829При создании точки останова связанное с ней имя файла должно быть в канонической форме. Если задано *funcname*, срабатывание точки останова засчитывается при выполнении первой строки этой функции. Условная точка останова всегда засчитывает срабатывание.3031Экземпляры [`Breakpoint`](https://python-all.ru/3.3/library/bdb.html#bdb.Breakpoint) имеют следующие методы:3233#### `deleteMe()`3435Удаляет точку останова из списка, связанного с файлом/строкой. Если это последняя точка останова в этой позиции, также удаляется запись для файла/строки.3637#### `enable()`3839Помечает точку останова как включенную.4041#### `disable()`4243Помечает точку останова как отключенную.4445#### `bpformat()`4647Возвращает строку со всей информацией о точке останова, аккуратно отформатированную:4849- Номер точки останова.50- Является ли она временной.51- Её позиция (файл, строка).52- Условие, вызывающее останов.53- Должна ли игнорироваться следующие N раз.54- Счётчик срабатываний точки останова.5556Новое в версии 3.2.5758#### `bpprint(out=None)`5960Выводит результат [`bpformat()`](https://python-all.ru/3.3/library/bdb.html#bdb.Breakpoint.bpformat) в файл *out*, или, если он равен `None`, в стандартный вывод.6162#### `class bdb.Bdb(skip=None)`6364Класс [`Bdb`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb) выступает в качестве общего базового класса отладчика Python.6566Этот класс берёт на себя детали механизма трассировки; производный класс должен реализовывать взаимодействие с пользователем. Стандартный класс отладчика ([`pdb.Pdb`](https://python-all.ru/3.3/library/pdb.html#pdb.Pdb)) является примером.6768Аргумент *skip*, если задан, должен быть итерабельным объектом с шаблонами имён модулей в стиле glob. Отладчик не будет входить в фреймы, которые происходят из модуля, соответствующего одному из этих шаблонов. Считается ли фрейм происходящим из определённого модуля, определяется по `__name__` в глобальных переменных фрейма.6970Новое в версии 3.1: аргумент *skip*.7172Следующие методы [`Bdb`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb) обычно не нужно переопределять.7374#### `canonic(filename)`7576Вспомогательный метод для получения имени файла в канонической форме, то есть в виде абсолютного пути с нормализованным регистром (на файловых системах без учёта регистра), из которого удалены обрамляющие угловые скобки.7778#### `reset()`7980Устанавливает атрибуты `botframe`, `stopframe`, `returnframe` и `quitting` со значениями, готовыми к началу отладки.8182#### `trace_dispatch(frame, event, arg)`8384Эта функция устанавливается как трассирующая функция для отлаживаемых фреймов. Её возвращаемое значение – новая трассирующая функция (в большинстве случаев она же).8586Реализация по умолчанию определяет, как диспетчеризовать фрейм, в зависимости от типа события (передаётся строкой), которое должно быть выполнено. *event* может быть одним из следующих:8788- `"line"`: Будет выполнена новая строка кода.89- `"call"`: Функция будет вызвана, или будет вход в другой блок кода.90- `"return"`: Функция или другой блок кода готовится выполнить возврат.91- `"исключение"`: Произошло исключение.92- `"c_call"`: Будет вызвана C-функция.93- `"c_return"`: C-функция вернулась.94- `"c_exception"`: C-функция вызвала исключение.9596Для событий Python вызываются специализированные функции (см. ниже). Для событий C никаких действий не выполняется.9798Параметр *arg* зависит от предыдущего события.99100Дополнительную информацию о функции трассировки см. в документации к [`sys.settrace()`](https://python-all.ru/3.3/library/sys.html#sys.settrace). Для получения дополнительных сведений об объектах кода и фреймов обращайтесь к [*Стандартной иерархии типов*](https://python-all.ru/3.3/reference/datamodel.html#types).101102#### `dispatch_line(frame)`103104Если отладчик должен остановиться на текущей строке, вызывается метод [`user_line()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.user_line) (который должен быть переопределён в подклассах). Возбуждается исключение [`BdbQuit`](https://python-all.ru/3.3/library/bdb.html#bdb.BdbQuit), если установлен флаг `Bdb.quitting` (который может быть установлен из [`user_line()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.user_line)). Возвращается ссылка на метод [`trace_dispatch()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.trace_dispatch) для дальнейшей трассировки в этой области.105106#### `dispatch_call(frame, arg)`107108Если отладчик должен остановиться на этом вызове функции, вызывается метод [`user_call()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.user_call) (который должен быть переопределён в подклассах). Возбуждается исключение [`BdbQuit`](https://python-all.ru/3.3/library/bdb.html#bdb.BdbQuit), если установлен флаг `Bdb.quitting` (который может быть установлен из [`user_call()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.user_call)). Возвращается ссылка на метод [`trace_dispatch()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.trace_dispatch) для дальнейшей трассировки в этой области.109110#### `dispatch_return(frame, arg)`111112Если отладчик должен остановиться на этом возврате из функции, вызывается метод [`user_return()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.user_return) (который должен быть переопределён в подклассах). Возбуждается исключение [`BdbQuit`](https://python-all.ru/3.3/library/bdb.html#bdb.BdbQuit), если установлен флаг `Bdb.quitting` (который может быть установлен из [`user_return()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.user_return)). Возвращается ссылка на метод [`trace_dispatch()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.trace_dispatch) для дальнейшей трассировки в этой области.113114#### `dispatch_exception(frame, arg)`115116Если отладчик должен остановиться на этом исключении, вызывается метод [`user_exception()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.user_exception) (который должен быть переопределён в подклассах). Возбуждается исключение [`BdbQuit`](https://python-all.ru/3.3/library/bdb.html#bdb.BdbQuit), если установлен флаг `Bdb.quitting` (который может быть установлен из [`user_exception()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.user_exception)). Возвращается ссылка на метод [`trace_dispatch()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.trace_dispatch) для дальнейшей трассировки в этой области.117118Обычно производные классы не переопределяют следующие методы, но могут, если хотят переопределить определение остановки и точек останова.119120#### `stop_here(frame)`121122Этот метод проверяет, находится ли *frame* где-то ниже `botframe` в стеке вызовов. `botframe` – это фрейм, в котором началась отладка.123124#### `break_here(frame)`125126Этот метод проверяет, есть ли точка останова в файле и строке, соответствующих *frame*, или хотя бы в текущей функции. Если точка останова временная, этот метод удаляет её.127128#### `break_anywhere(frame)`129130Этот метод проверяет, есть ли точка останова в имени файла текущего кадра.131132Производные классы должны переопределять эти методы, чтобы получить контроль над работой отладчика.133134#### `user_call(frame, argument_list)`135136Этот метод вызывается из [`dispatch_call()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.dispatch_call), когда есть вероятность, что может потребоваться точка останова где-либо внутри вызываемой функции.137138#### `user_line(frame)`139140Этот метод вызывается из [`dispatch_line()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.dispatch_line), когда [`stop_here()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.stop_here) или [`break_here()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.break_here) возвращает `True`.141142#### `user_return(frame, return_value)`143144Этот метод вызывается из [`dispatch_return()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.dispatch_return), когда [`stop_here()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.stop_here) возвращает `True`.145146#### `user_exception(frame, exc_info)`147148Этот метод вызывается из [`dispatch_exception()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.dispatch_exception), когда [`stop_here()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.stop_here) возвращает `True`.149150#### `do_clear(arg)`151152Обрабатывает, как должна быть удалена точка останова, если она временная.153154Этот метод должен быть реализован в производных классах.155156Производные классы и клиенты могут вызывать следующие методы для управления состоянием пошагового выполнения.157158#### `set_step()`159160Остановиться после одной строки кода.161162#### `set_next(frame)`163164Остановиться на следующей строке внутри или ниже заданного фрейма.165166#### `set_return(frame)`167168Остановиться при возврате из заданного фрейма.169170#### `set_until(frame)`171172Остановка, когда будет достигнута строка с номером, большим текущего, или при возврате из текущего фрейма.173174#### `set_trace([frame])`175176Начать отладку с *frame*. Если *frame* не указан, отладка начинается с фрейма вызывающего кода.177178#### `set_continue()`179180Останавливается только на точках останова или при завершении. Если точек останова нет, системная функция трассировки устанавливается в None.181182#### `set_quit()`183184Устанавливает атрибут `quitting` в `True`. Это вызывает исключение [`BdbQuit`](https://python-all.ru/3.3/library/bdb.html#bdb.BdbQuit) при следующем вызове одного из методов `dispatch_*()`.185186Производные классы и клиенты могут вызывать следующие методы для управления точками останова. Эти методы возвращают строку с сообщением об ошибке, если что-то пошло не так, или `None`, если всё в порядке.187188#### `set_break(filename, lineno, temporary=0, cond, funcname)`189190Устанавливает новую точку останова. Если строка *lineno* не существует для *filename*, переданного в качестве аргумента, возвращает сообщение об ошибке. *filename* должен быть в канонической форме, как описано в методе [`canonic()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.canonic).191192#### `clear_break(filename, lineno)`193194Удаляет точки останова в *filename* и *lineno*. Если ни одной не было установлено, возвращается сообщение об ошибке.195196#### `clear_bpbynumber(arg)`197198Удаляет точку останова с индексом *arg* из `Breakpoint.bpbynumber`. Если *arg* не является числом или выходит за пределы диапазона, возвращает сообщение об ошибке.199200#### `clear_all_file_breaks(filename)`201202Удаляет все точки останова в *filename*. Если ни одной не было установлено, возвращается сообщение об ошибке.203204#### `clear_all_breaks()`205206Удаляет все существующие точки останова.207208#### `get_bpbynumber(arg)`209210Возвращает точку останова, заданную указанным номером. Если *arg* – строка, она преобразуется в число. Если *arg* – нечисловая строка, указанная точка останова никогда не существовала или была удалена, возбуждается [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError).211212Новое в версии 3.2.213214#### `get_break(filename, lineno)`215216Проверяет, существует ли точка останова для *lineno* в *filename*.217218#### `get_breaks(filename, lineno)`219220Возвращает все точки останова для *lineno* в *filename*, или пустой список, если ни одной не установлено.221222#### `get_file_breaks(filename)`223224Возвращает все точки останова в *filename*, или пустой список, если ни одной не установлено.225226#### `get_all_breaks()`227228Возвращает все установленные точки останова.229230Производные классы и клиенты могут вызывать следующие методы для получения структуры данных, представляющей стек вызовов.231232#### `get_stack(f, t)`233234Возвращает список записей для фрейма, всех вышележащих (вызывающих) и нижележащих фреймов, а также размер вышележащей части.235236#### `format_stack_entry(frame_lineno, lprefix=': ')`237238Возвращает строку с информацией о записи стека, идентифицируемой кортежем `(frame, lineno)`:239240- Каноническая форма имени файла, содержащего фрейм.241- Имя функции или `"<lambda>"`.242- Входные аргументы.243- Возвращаемое значение.244- Строка кода (если она существует).245246Следующие два метода могут вызываться клиентами для отладки [*оператора*](https://python-all.ru/3.3/glossary.html#term-statement), заданного строкой.247248#### `run(cmd, globals=None, locals=None)`249250Отлаживает инструкцию, выполняемую через функцию [`exec()`](https://python-all.ru/3.3/library/functions.html#exec). *globals* по умолчанию равен `__main__.__dict__`, а *locals* по умолчанию равен *globals*.251252#### `runeval(expr, globals=None, locals=None)`253254Отлаживает выражение, выполняемое через функцию [`eval()`](https://python-all.ru/3.3/library/functions.html#eval). *globals* и *locals* имеют тот же смысл, что и в [`run()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.run).255256#### `runctx(cmd, globals, locals)`257258Для обратной совместимости. Вызывает метод [`run()`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb.run).259260#### `runcall(func, *args, **kwds)`261262Отлаживает одиночный вызов функции и возвращает её результат.263264Наконец, модуль определяет следующие функции:265266#### `bdb.checkfuncname(b, frame)`267268Проверяет, нужно ли останавливаться здесь, в зависимости от того, как была установлена точка останова *b*.269270Если она была установлена по номеру строки, проверяется, совпадает ли `b.line` с номером строки во фрейме, также переданном в качестве аргумента. Если точка останова была установлена по имени функции, необходимо проверить, находимся ли мы в нужном фрейме (в нужной функции) и находимся ли мы на её первой исполняемой строке.271272#### `bdb.effective(file, line, frame)`273274Определяет, имеется ли действующая (активная) точка останова на данной строке кода. Возвращает кортеж, содержащий точку останова и логическое значение, указывающее, можно ли удалить временную точку останова. Возвращает `(None, None)`, если подходящая точка останова отсутствует.275276#### `bdb.set_trace()`277278Начинает отладку с экземпляра [`Bdb`](https://python-all.ru/3.3/library/bdb.html#bdb.Bdb) из фрейма вызывающего кода.279