> **Источник:** https://python-all.ru/2.7/library/bdb.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 26.1. [`bdb`](https://python-all.ru/2.7/library/bdb.html#module-bdb) – каркас отладчика

**Исходный код:** [Lib/bdb.py](https://python-all.ru/src/2.7/Lib/bdb.py)

---

Модуль [`bdb`](https://python-all.ru/2.7/library/bdb.html#module-bdb) реализует базовые функции отладчика, такие как установка точек останова или управление выполнением через отладчик.

Определено следующее исключение:

#### `exception bdb.BdbQuit`

Исключение, вызываемое классом [`Bdb`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb) для выхода из отладчика.

Модуль [`bdb`](https://python-all.ru/2.7/library/bdb.html#module-bdb) также определяет два класса:

#### `class bdb.Breakpoint(self, file, line, temporary=0, cond=None, funcname=None)`

Этот класс реализует временные точки останова, счетчики игнорирования, отключение и (повторное) включение, а также условия.

Точки останова индексируются по номеру через список `bpbynumber` и по парам `(file, line)` через `bplist`. Первое указывает на единственный экземпляр класса [`Breakpoint`](https://python-all.ru/2.7/library/bdb.html#bdb.Breakpoint). Второе – на список таких экземпляров, так как на одной строке может быть несколько точек останова.

При создании точки останова связанное с ней имя файла должно быть в канонической форме. Если задано *funcname*, срабатывание точки останова засчитывается при выполнении первой строки этой функции. Условная точка останова всегда засчитывает срабатывание.

Экземпляры [`Breakpoint`](https://python-all.ru/2.7/library/bdb.html#bdb.Breakpoint) имеют следующие методы:

#### `deleteMe()`

Удаляет точку останова из списка, связанного с файлом/строкой. Если это последняя точка останова в этой позиции, также удаляется запись для файла/строки.

#### `enable()`

Помечает точку останова как включенную.

#### `disable()`

Помечает точку останова как отключенную.

#### `pprint([out])`

Вывести всю информацию о точке останова:

- Номер точки останова.
- Является ли она временной.
- Её позиция (файл, строка).
- Условие, вызывающее останов.
- Должна ли игнорироваться следующие N раз.
- Счётчик срабатываний точки останова.

#### `class bdb.Bdb(skip=None)`

Класс [`Bdb`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb) является базовым классом универсального отладчика Python.

Этот класс берёт на себя детали механизма трассировки; производный класс должен реализовывать взаимодействие с пользователем. Стандартный класс отладчика ([`pdb.Pdb`](https://python-all.ru/2.7/library/pdb.html#pdb.Pdb)) является примером.

Аргумент *skip*, если указан, должен быть итерируемым объектом с шаблонами имён модулей в стиле glob. Отладчик не будет входить во фреймы, которые происходят из модуля, соответствующего одному из этих шаблонов. Определение того, считается ли фрейм происходящим из определённого модуля, выполняется с помощью `__name__` в глобальных переменных фрейма.

Новое в версии 2.7: Аргумент *skip*.

Следующие методы [`Bdb`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb) обычно не требуют переопределения.

#### `canonic(filename)`

Вспомогательный метод для получения имени файла в канонической форме, то есть в виде абсолютного пути с нормализованным регистром (на файловых системах без учёта регистра), из которого удалены обрамляющие угловые скобки.

#### `reset()`

Устанавливает атрибуты `botframe`, `stopframe`, `returnframe` и `quitting` со значениями, готовыми к началу отладки.

#### `trace_dispatch(frame, event, arg)`

Эта функция устанавливается как трассирующая функция для отлаживаемых фреймов. Её возвращаемое значение – новая трассирующая функция (в большинстве случаев она же).

Реализация по умолчанию определяет, как диспетчеризовать фрейм, в зависимости от типа события (передаётся строкой), которое должно быть выполнено. *event* может быть одним из следующих:

- `"line"`: Будет выполнена новая строка кода.
- `"call"`: Функция или другой блок кода будет вызван.
- `"return"`: Функция или другой блок кода собирается вернуть значение.
- `"exception"`: Произошло исключение.
- `"c_call"`: C-функция будет вызвана.
- `"c_return"`: C-функция вернулась.
- `"c_exception"`: C-функция вызвала исключение.

Для событий Python вызываются специализированные функции (см. ниже). Для событий C никаких действий не выполняется.

Параметр *arg* зависит от предыдущего события.

См. документацию к [`sys.settrace()`](https://python-all.ru/2.7/library/sys.html#sys.settrace) для получения дополнительной информации о трассирующей функции. За дополнительными сведениями об объектах кода и фреймов обратитесь к [Стандартной иерархии типов](https://python-all.ru/2.7/reference/datamodel.html#types).

#### `dispatch_line(frame)`

Если отладчик должен остановиться на текущей строке, вызвать метод [`user_line()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.user_line) (который следует переопределять в подклассах). Возбудить исключение [`BdbQuit`](https://python-all.ru/2.7/library/bdb.html#bdb.BdbQuit), если установлен флаг `Bdb.quitting` (который можно установить из [`user_line()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.user_line)). Возвратить ссылку на метод [`trace_dispatch()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.trace_dispatch) для дальнейшей трассировки в этой области видимости.

#### `dispatch_call(frame, arg)`

Если отладчик должен остановиться на этом вызове функции, вызвать метод [`user_call()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.user_call) (который следует переопределять в подклассах). Возбудить исключение [`BdbQuit`](https://python-all.ru/2.7/library/bdb.html#bdb.BdbQuit), если установлен флаг `Bdb.quitting` (который можно установить из [`user_call()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.user_call)). Возвратить ссылку на метод [`trace_dispatch()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.trace_dispatch) для дальнейшей трассировки в этой области видимости.

#### `dispatch_return(frame, arg)`

Если отладчик должен остановиться на этом возврате из функции, вызвать метод [`user_return()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.user_return) (который следует переопределять в подклассах). Возбудить исключение [`BdbQuit`](https://python-all.ru/2.7/library/bdb.html#bdb.BdbQuit), если установлен флаг `Bdb.quitting` (который можно установить из [`user_return()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.user_return)). Возвратить ссылку на метод [`trace_dispatch()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.trace_dispatch) для дальнейшей трассировки в этой области видимости.

#### `dispatch_exception(frame, arg)`

Если отладчик должен остановиться на этом исключении, вызывается метод [`user_exception()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.user_exception) (который следует переопределять в подклассах). Возбудить исключение [`BdbQuit`](https://python-all.ru/2.7/library/bdb.html#bdb.BdbQuit), если установлен флаг `Bdb.quitting` (который можно установить из [`user_exception()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.user_exception)). Возвратить ссылку на метод [`trace_dispatch()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.trace_dispatch) для дальнейшей трассировки в этой области видимости.

Обычно производные классы не переопределяют следующие методы, но могут, если хотят переопределить определение остановки и точек останова.

#### `stop_here(frame)`

Этот метод проверяет, находится ли *frame* где-то ниже `botframe` в стеке вызовов. `botframe` – это кадр, с которого началась отладка.

#### `break_here(frame)`

Этот метод проверяет, есть ли точка останова в файле и строке, соответствующих *frame*, или хотя бы в текущей функции. Если точка останова временная, этот метод удаляет её.

#### `break_anywhere(frame)`

Этот метод проверяет, есть ли точка останова в имени файла текущего кадра.

Производные классы должны переопределять эти методы, чтобы получить контроль над работой отладчика.

#### `user_call(frame, argument_list)`

Этот метод вызывается из [`dispatch_call()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.dispatch_call), когда есть вероятность того, что может потребоваться остановка где-либо внутри вызываемой функции.

#### `user_line(frame)`

Этот метод вызывается из [`dispatch_line()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.dispatch_line), когда [`stop_here()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.stop_here) или [`break_here()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.break_here) даёт `True`.

#### `user_return(frame, return_value)`

Этот метод вызывается из [`dispatch_return()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.dispatch_return), когда [`stop_here()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.stop_here) даёт `True`.

#### `user_exception(frame, exc_info)`

Этот метод вызывается из [`dispatch_exception()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.dispatch_exception), когда [`stop_here()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.stop_here) выдаёт `True`.

#### `do_clear(arg)`

Обрабатывает, как должна быть удалена точка останова, если она временная.

Этот метод должен быть реализован в производных классах.

Производные классы и клиенты могут вызывать следующие методы для управления состоянием пошагового выполнения.

#### `set_step()`

Остановиться после одной строки кода.

#### `set_next(frame)`

Остановиться на следующей строке внутри или ниже заданного фрейма.

#### `set_return(frame)`

Остановиться при возврате из заданного фрейма.

#### `set_until(frame)`

Остановка при достижении строки с номером, не превышающим текущий, или при возврате из текущего фрейма.

#### `set_trace([frame])`

Начать отладку с *frame*. Если *frame* не указан, отладка начинается с фрейма вызывающего кода.

#### `set_continue()`

Останавливаться только в точках останова или при завершении. Если точек останова нет, устанавливает системную трассировочную функцию в `None`.

#### `set_quit()`

Устанавливает атрибут `quitting` в `True`. Это вызывает [`BdbQuit`](https://python-all.ru/2.7/library/bdb.html#bdb.BdbQuit) при следующем вызове одного из методов `dispatch_*()`.

Производные классы и клиенты могут вызывать следующие методы для управления точками останова. Эти методы возвращают строку с сообщением об ошибке, если что-то пошло не так, или `None`, если всё в порядке.

#### `set_break(filename, lineno, temporary=0, cond=None, funcname=None)`

Установить новую точку останова. Если строки с *lineno* не существует для *filename*, переданного в качестве аргумента, возвращается сообщение об ошибке. *filename* должен быть в канонической форме, как описано в методе [`canonic()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.canonic).

#### `clear_break(filename, lineno)`

Удаляет точки останова в *filename* и *lineno*. Если ни одной не было установлено, возвращается сообщение об ошибке.

#### `clear_bpbynumber(arg)`

Удаляет точку останова с индексом *arg* из `Breakpoint.bpbynumber`. Если *arg* не является числом или выходит за пределы, возвращает сообщение об ошибке.

#### `clear_all_file_breaks(filename)`

Удаляет все точки останова в *filename*. Если ни одной не было установлено, возвращается сообщение об ошибке.

#### `clear_all_breaks()`

Удаляет все существующие точки останова.

#### `get_break(filename, lineno)`

Проверяет, существует ли точка останова для *lineno* в *filename*.

#### `get_breaks(filename, lineno)`

Возвращает все точки останова для *lineno* в *filename*, или пустой список, если ни одной не установлено.

#### `get_file_breaks(filename)`

Возвращает все точки останова в *filename*, или пустой список, если ни одной не установлено.

#### `get_all_breaks()`

Возвращает все установленные точки останова.

Производные классы и клиенты могут вызывать следующие методы для получения структуры данных, представляющей стек вызовов.

#### `get_stack(f, t)`

Возвращает список записей для фрейма, всех вышележащих (вызывающих) и нижележащих фреймов, а также размер вышележащей части.

#### `format_stack_entry(frame_lineno[, lprefix=': '])`

Возвращает строку с информацией о записи стека, идентифицируемой кортежем `(frame, lineno)`:

- Каноническая форма имени файла, содержащего фрейм.
- Имя функции или `"<lambda>"`.
- Входные аргументы.
- Возвращаемое значение.
- Строка кода (если она существует).

Следующие два метода могут вызываться клиентами для отладки [оператора](https://python-all.ru/2.7/glossary.html#term-statement), заданного строкой.

#### `run(cmd[, globals[, locals]])`

Отладка инструкции, выполненной через инструкцию [`exec`](https://python-all.ru/2.7/reference/simple_stmts.html#exec). *globals* по умолчанию равно `__main__.__dict__`, *locals* по умолчанию равно *globals*.

#### `runeval(expr[, globals[, locals]])`

Отлаживает выражение, выполняемое через функцию [`eval()`](https://python-all.ru/2.7/library/functions.html#eval). *globals* и *locals* имеют тот же смысл, что и в [`run()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.run).

#### `runctx(cmd, globals, locals)`

Для обратной совместимости. Вызывает метод [`run()`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb.run).

#### `runcall(func, *args, **kwds)`

Отлаживает одиночный вызов функции и возвращает её результат.

Наконец, модуль определяет следующие функции:

#### `bdb.checkfuncname(b, frame)`

Проверяет, нужно ли останавливаться здесь, в зависимости от того, как была установлена точка останова *b*.

Если она была установлена по номеру строки, проверяется, совпадает ли `b.line` с номером строки во фрейме, также переданном в качестве аргумента. Если точка останова была установлена по имени функции, необходимо проверить, находимся ли мы в правильном фрейме (правильной функции) и находимся ли мы на её первой исполняемой строке.

#### `bdb.effective(file, line, frame)`

Определяет, есть ли действующая (активная) точка останова в данной строке кода. Возвращает кортеж с точкой останова и логическим значением, указывающим, можно ли удалить временную точку останова. Возвращает `(None, None)`, если подходящей точки останова нет.

#### `bdb.set_trace()`

Начинает отладку с экземпляром [`Bdb`](https://python-all.ru/2.7/library/bdb.html#bdb.Bdb) из фрейма вызывающего кода.
