bdb.md
1> **Источник:** https://python-all.ru/3.16/library/bdb.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `bdb` – фреймворк отладчика89**Исходный код:** [Lib/bdb.py](https://python-all.ru/src/main/Lib/bdb.py)1011---1213Модуль `bdb` реализует базовые функции отладчика, такие как установка точек останова или управление выполнением через отладчик.1415Определено следующее исключение:1617#### `exception bdb.BdbQuit`1819Исключение, вызываемое классом [`Bdb`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb) для выхода из отладчика.2021Модуль `bdb` также определяет два класса:2223#### `class bdb.Breakpoint(self, file, line, temporary=False, cond=None, funcname=None)`2425Этот класс реализует временные точки останова, счетчики игнорирования, отключение и (повторное) включение, а также условия.2627Точки останова индексируются по номеру через список с именем [`bpbynumber`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.bpbynumber) и по парам `(file, line)` через [`bplist`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.bplist). Первый указывает на один экземпляр класса `Breakpoint`. Второй указывает на список таких экземпляров, так как на одной строке может быть несколько точек останова.2829При создании точки останова связанное с ней [`file name`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.file) должно быть в канонической форме. Если задан [`funcname`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.funcname), то точка останова [`hit`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.hits) будет учтена при выполнении первой строки этой функции. Точка останова [`conditional`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.cond) всегда учитывает `hit`.3031Экземпляры `Breakpoint` имеют следующие методы:3233#### `deleteMe()`3435Удаляет точку останова из списка, связанного с файлом/строкой. Если это последняя точка останова в этой позиции, также удаляется запись для файла/строки.3637#### `enable()`3839Помечает точку останова как включенную.4041#### `disable()`4243Помечает точку останова как отключенную.4445#### `bpformat()`4647Возвращает строку со всей информацией о точке останова, аккуратно отформатированную:4849- Номер точки останова.50- Временный статус (del или keep).51- Позиция файла/строки.52- Условие останова.53- Количество пропусков.54- Количество срабатываний.5556Добавлено в версии 3.2.5758#### `bpprint(out=None)`5960Выводит результат [`bpformat()`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.bpformat) в файл *out* или, если он равен `None`, на стандартный вывод.6162Экземпляры `Breakpoint` имеют следующие атрибуты:6364#### `file`6566Имя файла `Breakpoint`.6768#### `line`6970Номер строки `Breakpoint` в [`file`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.file).7172#### `temporary`7374`True`, если `Breakpoint` в (файл, строка) временная.7576#### `cond`7778Условие для вычисления `Breakpoint` в (файл, строка).7980#### `funcname`8182Имя функции, определяющее, срабатывает ли `Breakpoint` при входе в функцию.8384#### `enabled`8586`True`, если `Breakpoint` включён.8788#### `bpbynumber`8990Числовой индекс для одного экземпляра `Breakpoint`.9192#### `bplist`9394Словарь экземпляров `Breakpoint`, проиндексированных кортежами ([`file`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.file), [`line`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.line)).9596#### `ignore`9798Количество раз, которое нужно игнорировать `Breakpoint`.99100#### `hits`101102Счётчик количества срабатываний `Breakpoint`.103104#### `class bdb.Bdb(skip=None, backend='settrace')`105106Класс `Bdb` является базовым классом универсального отладчика Python.107108Этот класс берёт на себя детали механизма трассировки; производный класс должен реализовывать взаимодействие с пользователем. Стандартный класс отладчика ([`pdb.Pdb`](https://python-all.ru/3.16/library/pdb.html#pdb.Pdb)) является примером.109110Аргумент *skip*, если указан, должен быть итерируемым объектом с шаблонами имён модулей в стиле glob. Отладчик не будет входить во фреймы, которые происходят из модуля, соответствующего одному из этих шаблонов. Определение того, считается ли фрейм происходящим из определённого модуля, выполняется с помощью `__name__` в глобальных переменных фрейма.111112Аргумент *backend* указывает используемый внутренний механизм для `Bdb`. Он может быть либо `'settrace'`, либо `'monitoring'`. `'settrace'` использует [`sys.settrace()`](https://python-all.ru/3.16/library/sys.html#sys.settrace), который обеспечивает наилучшую обратную совместимость. Внутренний механизм `'monitoring'` использует новый [`sys.monitoring`](https://python-all.ru/3.16/library/sys.monitoring.html#module-sys.monitoring), появившийся в Python 3.12, который может быть гораздо эффективнее, поскольку он может отключать неиспользуемые события. Мы стараемся сохранить точные интерфейсы для обоих внутренних механизмов, но есть некоторые различия. Разработчикам отладчика рекомендуется использовать внутренний механизм `'monitoring'` для достижения лучшей производительности.113114Изменено в версии 3.1: Добавлен параметр *skip*.115116Изменено в версии 3.14: Добавлен параметр *backend*.117118Следующие методы `Bdb` обычно не требуют переопределения.119120#### `canonic(filename)`121122Возвращает каноническую форму *filename*.123124Для реальных имён файлов каноническая форма зависит от операционной системы, [`case-normalized`](https://python-all.ru/3.16/library/os.path.html#os.path.normcase) [`absolute path`](https://python-all.ru/3.16/library/os.path.html#os.path.abspath). *filename* с угловыми скобками, например `"<stdin>"`, сгенерированное в интерактивном режиме, возвращается без изменений.125126#### `start_trace(self)`127128Запускает трассировку. Для внутреннего механизма `'settrace'` этот метод эквивалентен `sys.settrace(self.trace_dispatch)`129130Добавлено в версии 3.14.131132#### `stop_trace(self)`133134Останавливает трассировку. Для бэкенда `'settrace'` этот метод эквивалентен `sys.settrace(None)`135136Добавлено в версии 3.14.137138#### `reset()`139140Устанавливает атрибуты `botframe`, `stopframe`, `returnframe` и [`quitting`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.set_quit) со значениями, готовыми к началу отладки.141142#### `trace_dispatch(frame, event, arg)`143144Эта функция устанавливается как трассирующая функция для отлаживаемых фреймов. Её возвращаемое значение – новая трассирующая функция (в большинстве случаев она же).145146Реализация по умолчанию определяет, как диспетчеризовать фрейм, в зависимости от типа события (передаётся строкой), которое должно быть выполнено. *event* может быть одним из следующих:147148- `"line"`: Будет выполнена новая строка кода.149- `"call"`: Функция или другой блок кода будет вызван.150- `"return"`: Функция или другой блок кода собирается вернуть значение.151- `"exception"`: Произошло исключение.152153Для всех событий вызываются специализированные функции (см. ниже).154155Параметр *arg* зависит от предыдущего события.156157См. документацию к [`sys.settrace()`](https://python-all.ru/3.16/library/sys.html#sys.settrace) для получения дополнительной информации о трассирующей функции. За дополнительными сведениями об объектах кода и фреймов обратитесь к [Стандартной иерархии типов](https://python-all.ru/3.16/reference/datamodel.html#types).158159#### `dispatch_line(frame)`160161Если отладчик должен остановиться на текущей строке, вызвать метод [`user_line()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.user_line) (который следует переопределять в подклассах). Возбудить исключение [`BdbQuit`](https://python-all.ru/3.16/library/bdb.html#bdb.BdbQuit), если установлен флаг [`quitting`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.set_quit) (который можно установить из `user_line()`). Возвратить ссылку на метод [`trace_dispatch()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.trace_dispatch) для дальнейшей трассировки в этой области видимости.162163#### `dispatch_call(frame, arg)`164165Если отладчик должен остановиться на этом вызове функции, вызвать метод [`user_call()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.user_call) (который следует переопределять в подклассах). Возбудить исключение [`BdbQuit`](https://python-all.ru/3.16/library/bdb.html#bdb.BdbQuit), если установлен флаг [`quitting`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.set_quit) (который можно установить из `user_call()`). Возвратить ссылку на метод [`trace_dispatch()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.trace_dispatch) для дальнейшей трассировки в этой области видимости.166167#### `dispatch_return(frame, arg)`168169Если отладчик должен остановиться на этом возврате из функции, вызвать метод [`user_return()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.user_return) (который следует переопределять в подклассах). Возбудить исключение [`BdbQuit`](https://python-all.ru/3.16/library/bdb.html#bdb.BdbQuit), если установлен флаг [`quitting`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.set_quit) (который можно установить из `user_return()`). Возвратить ссылку на метод [`trace_dispatch()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.trace_dispatch) для дальнейшей трассировки в этой области видимости.170171#### `dispatch_exception(frame, arg)`172173Если отладчик должен остановиться на этом исключении, вызывается метод [`user_exception()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.user_exception) (который следует переопределять в подклассах). Возбудить исключение [`BdbQuit`](https://python-all.ru/3.16/library/bdb.html#bdb.BdbQuit), если установлен флаг [`quitting`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.set_quit) (который можно установить из `user_exception()`). Возвратить ссылку на метод [`trace_dispatch()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.trace_dispatch) для дальнейшей трассировки в этой области видимости.174175Обычно производные классы не переопределяют следующие методы, но могут, если хотят переопределить определение остановки и точек останова.176177#### `is_skipped_module(module_name)`178179Возвращает `True`, если *module\_name* соответствует какому-либо шаблону пропуска.180181#### `stop_here(frame)`182183Возвращает `True`, если *frame* находится ниже начального фрейма в стеке.184185#### `break_here(frame)`186187Возвращает `True`, если для этой строки есть действующая точка останова.188189Проверяет, существует ли точка останова на строку или функцию и активна ли она. Удаляет временные точки останова на основе информации из [`effective()`](https://python-all.ru/3.16/library/bdb.html#bdb.effective).190191#### `break_anywhere(frame)`192193Возвращает `True`, если для имени файла *frame* существует какая-либо точка останова.194195Производные классы должны переопределять эти методы, чтобы получить контроль над работой отладчика.196197#### `user_call(frame, argument_list)`198199Вызывается из [`dispatch_call()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.dispatch_call), если точка останова может сработать внутри вызываемой функции.200201*argument\_list* больше не используется и всегда будет `None`. Аргумент сохранён для обратной совместимости.202203#### `user_line(frame)`204205Вызывается из [`dispatch_line()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.dispatch_line), когда [`stop_here()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.stop_here) или [`break_here()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.break_here) возвращает `True`.206207#### `user_return(frame, return_value)`208209Вызывается из [`dispatch_return()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.dispatch_return), когда [`stop_here()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.stop_here) возвращает `True`.210211#### `user_exception(frame, exc_info)`212213Вызывается из [`dispatch_exception()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.dispatch_exception), когда [`stop_here()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.stop_here) возвращает `True`.214215#### `do_clear(arg)`216217Обрабатывает, как должна быть удалена точка останова, если она временная.218219Этот метод должен быть реализован в производных классах.220221Производные классы и клиенты могут вызывать следующие методы для управления состоянием пошагового выполнения.222223#### `set_step()`224225Остановиться после одной строки кода.226227#### `set_next(frame)`228229Остановиться на следующей строке внутри или ниже заданного фрейма.230231#### `set_return(frame)`232233Остановиться при возврате из заданного фрейма.234235#### `set_until(frame, lineno=None)`236237Остановиться, когда будет достигнута строка с *lineno* больше текущей, или при возврате из текущего фрейма.238239#### `set_trace([frame])`240241Начать отладку с *frame*. Если *frame* не указан, отладка начинается с фрейма вызывающего кода.242243Изменено в версии 3.13: [`set_trace()`](https://python-all.ru/3.16/library/bdb.html#bdb.set_trace) теперь войдёт в отладчик немедленно, а не на следующей исполняемой строке кода.244245#### `set_continue()`246247Останавливаться только в точках останова или при завершении. Если точек останова нет, устанавливает системную трассировочную функцию в `None`.248249#### `set_quit()`250251Устанавливает атрибут `quitting` в `True`. Это вызывает [`BdbQuit`](https://python-all.ru/3.16/library/bdb.html#bdb.BdbQuit) при следующем вызове одного из методов `dispatch_*()`.252253Производные классы и клиенты могут вызывать следующие методы для управления точками останова. Эти методы возвращают строку с сообщением об ошибке, если что-то пошло не так, или `None`, если всё в порядке.254255#### `set_break(filename, lineno, temporary=False, cond=None, funcname=None)`256257Установить новую точку останова. Если строки с *lineno* не существует для *filename*, переданного в качестве аргумента, возвращается сообщение об ошибке. *filename* должен быть в канонической форме, как описано в методе [`canonic()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.canonic).258259#### `clear_break(filename, lineno)`260261Удаляет точки останова в *filename* и *lineno*. Если ни одна не установлена, возвращает сообщение об ошибке.262263#### `clear_bpbynumber(arg)`264265Удаляет точку останова с индексом *arg* из [`Breakpoint.bpbynumber`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.bpbynumber). Если *arg* не является числом или выходит за пределы, возвращает сообщение об ошибке.266267#### `clear_all_file_breaks(filename)`268269Удаляет все точки останова в *filename*. Если ни одной не установлено, возвращает сообщение об ошибке.270271#### `clear_all_breaks()`272273Удаляет все существующие точки останова. Если ни одной не установлено, возвращает сообщение об ошибке.274275#### `get_bpbynumber(arg)`276277Возвращает точку останова, заданную указанным номером. Если *arg* – строка, она преобразуется в число. Если *arg* – нечисловая строка, если указанная точка останова никогда не существовала или была удалена, возбуждается [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError).278279Добавлено в версии 3.2.280281#### `get_break(filename, lineno)`282283Возвращает `True`, если для *lineno* в *filename* существует точка останова.284285#### `get_breaks(filename, lineno)`286287Возвращает все точки останова для *lineno* в *filename*, или пустой список, если ни одной не установлено.288289#### `get_file_breaks(filename)`290291Возвращает все точки останова в *filename*, или пустой список, если ни одной не установлено.292293#### `get_all_breaks()`294295Возвращает все установленные точки останова.296297Производные классы и клиенты могут вызывать следующие методы, чтобы отключать и перезапускать события для повышения производительности. Эти методы работают только при использовании внутреннего механизма `'monitoring'`.298299#### `disable_current_event()`300301Отключает текущее событие до тех пор, пока [`restart_events()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.restart_events) не будет вызван снова. Это полезно, когда отладчику не интересна текущая строка.302303Добавлено в версии 3.14.304305#### `restart_events()`306307Перезапускает все отключённые события. Эта функция автоматически вызывается в методах `dispatch_*` после вызова методов `user_*`. Если методы `dispatch_*` не переопределены, отключённые события будут перезапускаться после каждого взаимодействия с пользователем.308309Добавлено в версии 3.14.310311Производные классы и клиенты могут вызывать следующие методы для получения структуры данных, представляющей стек вызовов.312313#### `get_stack(f, t)`314315Возвращает список кортежей (frame, lineno) в стеке вызовов, а также размер.316317Самый последний вызванный фрейм находится в конце списка. Размер – это количество фреймов ниже фрейма, в котором был вызван отладчик.318319#### `format_stack_entry(frame_lineno, lprefix=': ')`320321Возвращает строку с информацией о записи стека, которая является кортежем `(frame, lineno)`. Возвращаемая строка содержит:322323- Каноническое имя файла, содержащего фрейм.324- Имя функции или `"<lambda>"`.325- Входные аргументы.326- Возвращаемое значение.327- Строка кода (если она существует).328329Следующие два метода могут вызываться клиентами для отладки [оператора](https://python-all.ru/3.16/glossary.html#term-statement), заданного строкой.330331#### `run(cmd, globals=None, locals=None)`332333Отлаживает оператор, выполняемый через функцию [`exec()`](https://python-all.ru/3.16/library/functions.html#exec). *globals* по умолчанию равно `__main__.__dict__`, *locals* по умолчанию равно *globals*.334335#### `runeval(expr, globals=None, locals=None)`336337Отлаживает выражение, выполняемое через функцию [`eval()`](https://python-all.ru/3.16/library/functions.html#eval). *globals* и *locals* имеют тот же смысл, что и в [`run()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.run).338339#### `runctx(cmd, globals, locals)`340341Для обратной совместимости. Вызывает метод [`run()`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb.run).342343#### `runcall(func, /, *args, **kwds)`344345Отлаживает одиночный вызов функции и возвращает её результат.346347Наконец, модуль определяет следующие функции:348349#### `bdb.checkfuncname(b, frame)`350351Возвращает `True`, если здесь нужно остановиться, в зависимости от того, как была установлена [`Breakpoint`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint) *b*.352353Если она была установлена по номеру строки, проверяется, совпадает ли [`b.line`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.line) с номером в *фрейме*. Если точка останова была установлена через [`function name`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.funcname), необходимо проверить, находимся ли мы в правильном *фрейме* (правильной функции) и находимся ли на первой исполняемой строке.354355#### `bdb.effective(file, line, frame)`356357Возвращает `(active breakpoint, delete temporary flag)` или `(None, None)` как точку останова, с которой нужно работать.358359*Активная точка останова* – это первая запись в [`bplist`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.bplist) для ([`file`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.file), [`line`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.line)) (которая должна существовать), которая является [`enabled`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.enabled), для которой [`checkfuncname()`](https://python-all.ru/3.16/library/bdb.html#bdb.checkfuncname) истинно, и у которой нет ни ложного [`condition`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.cond), ни положительного [`ignore`](https://python-all.ru/3.16/library/bdb.html#bdb.Breakpoint.ignore) счётчика. *Флаг*, означающий, что временная точка останова должна быть удалена, равен `False` только тогда, когда `cond` невозможно вычислить (в этом случае `ignore` счётчик игнорируется).360361Если такой записи не существует, возвращается `(None, None)`.362363#### `bdb.set_trace()`364365Начинает отладку с экземпляром [`Bdb`](https://python-all.ru/3.16/library/bdb.html#bdb.Bdb) из фрейма вызывающего кода.366