bdb
— Фреймворк отладчика¶
Источник: Lib/bdb.py
Модуль bdb
выполняет основные функции отладчика, такие как установка точек останова или управление выполнением через отладчик.
Определено следующее исключение:
Модуль bdb
также определяет два класса:
- class bdb.Breakpoint(self, file, line, temporary=False, cond=None, funcname=None)¶
Этот класс реализует временные точки останова, подсчет игнорирования, отключение и (повторное) включение, а также условные сигналы.
Точки останова индексируются по номерам в списке
bpbynumber
и по парам(file, line)
вbplist
. Первая указывает на один экземпляр классаBreakpoint
. Вторая указывает на список таких экземпляров, поскольку в одной строке может быть более одной точки останова.При создании точки останова связанный с ней
file name
должен быть в канонической форме. Если заданаfuncname
, точка остановаhit
будет засчитана при выполнении первой строки этой функции. Точка остановаconditional
всегда засчитывается какhit
.У экземпляров
Breakpoint
есть следующие методы:- deleteMe()¶
Удаление точки останова из списка, связанного с файлом/линией. Если это последняя точка останова в данной позиции, то удаляется и запись для файла/линии.
- enable()¶
Пометьте точку останова как включенную.
- disable()¶
Пометить точку останова как отключенную.
- bpformat()¶
Возвращает строку со всей информацией о точке останова, красиво отформатированную:
Номер точки останова.
Временный статус (del или keep).
Положение файла/линии.
Состояние разрыва.
Количество раз игнорирования.
Количество ударов.
Added in version 3.2.
- bpprint(out=None)¶
Выведите вывод
bpformat()
в файл out, или, если этоNone
, в стандартный вывод.
Экземпляры
Breakpoint
имеют следующие атрибуты:- file¶
Имя файла
Breakpoint
.
- line¶
Номер строки
Breakpoint
внутриfile
.
- temporary¶
True
, еслиBreakpoint
на (файл, строка) является временным.
- cond¶
Условие для оценки
Breakpoint
в (файл, строка).
- funcname¶
Имя функции, определяющее, будет ли введен
Breakpoint
при входе в функцию.
- enabled¶
True
, если включенBreakpoint
.
- bpbynumber¶
Числовой индекс для одного экземпляра
Breakpoint
.
- bplist¶
Словарь экземпляров
Breakpoint
, индексированных кортежами (file
,line
).
- ignore¶
Количество раз для игнорирования
Breakpoint
.
- hits¶
Подсчитывает количество попаданий в
Breakpoint
.
- class bdb.Bdb(skip=None)¶
Класс
Bdb
действует как общий базовый класс отладчика Python.Этот класс заботится о деталях средства трассировки; производный класс должен реализовать взаимодействие с пользователем. В качестве примера можно привести стандартный класс отладчика (
pdb.Pdb
).Аргумент skip, если он задан, должен представлять собой итерацию шаблонов имен модулей в стиле glob. Отладчик не будет переходить к кадрам, возникшим в модуле, который соответствует одному из этих шаблонов. Считается ли кадр происходящим из определенного модуля, определяется значением
__name__
в глобалах кадров.Изменено в версии 3.1: Добавлен параметр skip.
Следующие методы
Bdb
обычно не нужно переопределять.- canonic(filename)¶
Возвращает каноническую форму имени filename.
Для реальных имен файлов канонической формой является зависящая от операционной системы форма
case-normalized
absolute path
. Имя файла с угловыми скобками, например"<stdin>"
, созданное в интерактивном режиме, возвращается без изменений.
- reset()¶
Установите для атрибутов
botframe
,stopframe
,returnframe
иquitting
значения, готовые для начала отладки.
- trace_dispatch(frame, event, arg)¶
Эта функция устанавливается в качестве функции трассировки отлаженных кадров. Ее возвращаемое значение - новая функция трассировки (в большинстве случаев это она сама).
Реализация по умолчанию решает, как отправлять кадр, в зависимости от типа события (переданного в виде строки), которое должно быть выполнено. Событие может быть одним из следующих:
"line"
: Будет выполнена новая строка кода."call"
: Сейчас будет вызвана функция или введен другой блок кода."return"
: Функция или другой блок кода вот-вот вернется."exception"
: Произошло исключение."c_call"
: Сейчас будет вызвана функция C."c_return"
: Вернулась функция C."c_exception"
: Функция C вызвала исключение.
Для событий Python вызываются специализированные функции (см. ниже). Для событий на языке C никаких действий не производится.
Параметр arg зависит от предыдущего события.
Дополнительные сведения о функции трассировки см. в документации к
sys.settrace()
. Дополнительные сведения об объектах кода и фрейма см. в Стандартная иерархия типов.
- dispatch_line(frame)¶
Если отладчик должен остановиться на текущей строке, вызовите метод
user_line()
(который должен быть переопределен в подклассах). Вызовите исключениеBdbQuit
, если установлен флагquitting
(который может быть установлен изuser_line()
). Возвращает ссылку на методtrace_dispatch()
для дальнейшей трассировки в этой области видимости.
- dispatch_call(frame, arg)¶
Если отладчик должен остановиться на этом вызове функции, вызовите метод
user_call()
(который должен быть переопределен в подклассах). Вызовите исключениеBdbQuit
, если установлен флагquitting
(который может быть установлен изuser_call()
). Возвращает ссылку на методtrace_dispatch()
для дальнейшей трассировки в этой области видимости.
- dispatch_return(frame, arg)¶
Если отладчик должен остановиться на возврате этой функции, вызовите метод
user_return()
(который должен быть переопределен в подклассах). Вызовите исключениеBdbQuit
, если установлен флагquitting
(который может быть установлен изuser_return()
). Возвращает ссылку на методtrace_dispatch()
для дальнейшей трассировки в этой области видимости.
- dispatch_exception(frame, arg)¶
Если отладчик должен остановиться на этом исключении, вызывается метод
user_exception()
(который должен быть переопределен в подклассах). Вызывает исключениеBdbQuit
, если установлен флагquitting
(который может быть установлен изuser_exception()
). Возвращает ссылку на методtrace_dispatch()
для дальнейшей трассировки в этой области видимости.
Обычно производные классы не переопределяют следующие методы, но они могут это сделать, если хотят переопределить определение остановок и точек останова.
- is_skipped_line(module_name)¶
Возвращает
True
, если имя_модуля соответствует любому шаблону пропуска.
- stop_here(frame)¶
Возвращает
True
, если кадр находится ниже начального кадра в стеке.
- break_here(frame)¶
Верните
True
, если для этой строки существует эффективная точка останова.Проверьте, существует ли и действует ли точка останова строки или функции. Удалите временные точки останова, основываясь на информации из
effective()
.
- break_anywhere(frame)¶
Возвращает
True
, если для имени файла кадр существует какая-либо точка останова.
Производные классы должны переопределять эти методы, чтобы получить контроль над работой отладчика.
- user_call(frame, argument_list)¶
Вызывается из
dispatch_call()
, если прерывание может остановиться внутри вызываемой функции.Список argument_list больше не используется и всегда будет равен
None
. Аргумент сохраняется для обратной совместимости.
- user_line(frame)¶
Вызывается из
dispatch_line()
, когда либоstop_here()
, либоbreak_here()
возвращаетTrue
.
- user_return(frame, return_value)¶
Вызывается из
dispatch_return()
, когдаstop_here()
возвращаетTrue
.
- user_exception(frame, exc_info)¶
Вызывается из
dispatch_exception()
, когдаstop_here()
возвращаетTrue
.
- do_clear(arg)¶
Укажите, как удалить точку останова, если она является временной.
Этот метод должен быть реализован производными классами.
Производные классы и клиенты могут вызывать следующие методы, чтобы повлиять на состояние шагов.
- set_step()¶
Остановитесь после одной строки кода.
- set_next(frame)¶
Остановитесь на следующей строке в заданном фрейме или под ним.
- set_return(frame)¶
Остановка при возврате из заданного кадра.
- set_until(frame, lineno=None)¶
Остановка при достижении строки с lineno больше текущей или при возврате из текущего кадра.
- set_trace([frame])¶
Начать отладку с кадра. Если frame не указан, отладка начинается с кадра вызывающей стороны.
Изменено в версии 3.13:
set_trace()
войдет в отладчик сразу, а не на следующей выполняемой строке кода.
- set_continue()¶
Останавливайтесь только в точках останова или по завершении работы. Если точек останова нет, установите для функции трассировки системы значение
None
.
- set_quit()¶
Установите для атрибута
quitting
значениеTrue
. Это повышает значениеBdbQuit
при следующем вызове одного из методовdispatch_*()
.
Производные классы и клиенты могут вызывать следующие методы для работы с точками останова. Эти методы возвращают строку, содержащую сообщение об ошибке, если что-то пошло не так, или
None
, если все в порядке.- set_break(filename, lineno, temporary=False, cond=None, funcname=None)¶
Установить новую точку останова. Если строка lineno не существует для filename, переданного в качестве аргумента, возвращается сообщение об ошибке. Имя filename должно быть в канонической форме, как описано в методе
canonic()
.
- clear_break(filename, lineno)¶
Удалить точки останова в filename и lineno. Если они не были установлены, верните сообщение об ошибке.
- clear_bpbynumber(arg)¶
Удалите точку останова, которая имеет индекс arg в
Breakpoint.bpbynumber
. Если arg не является числовым или выходит за пределы диапазона, возвращается сообщение об ошибке.
- clear_all_file_breaks(filename)¶
Удалить все точки останова в filename. Если ни одна из них не была установлена, возвращается сообщение об ошибке.
- clear_all_breaks()¶
Удалить все существующие точки останова. Если ни одна из них не была установлена, возвращается сообщение об ошибке.
- get_bpbynumber(arg)¶
Возвращает точку останова, указанную заданным числом. Если arg - строка, она будет преобразована в число. Если arg - не числовая строка, если заданная точка останова никогда не существовала или была удалена, то будет вызвана ошибка
ValueError
.Added in version 3.2.
- get_break(filename, lineno)¶
Возвращает
True
, если существует точка останова для lineno в filename.
- get_breaks(filename, lineno)¶
Возвращает все точки останова для lineno в filename, или пустой список, если ни одна из них не установлена.
- get_file_breaks(filename)¶
Возвращает все точки останова в filename, или пустой список, если ни одна из них не установлена.
- get_all_breaks()¶
Возвращает все установленные точки останова.
Производные классы и клиенты могут вызывать следующие методы, чтобы получить структуру данных, представляющую трассировку стека.
- get_stack(f, t)¶
Возвращает список (frame, lineno) кортежей в трассировке стека и размер.
Последний вызванный кадр будет последним в списке. Размер - это количество кадров ниже кадра, в котором был вызван отладчик.
- format_stack_entry(frame_lineno, lprefix=': ')¶
Возвращает строку с информацией о записи в стеке, которая представляет собой кортеж
(frame, lineno)
. Возвращаемая строка содержит:Каноническое имя файла, содержащего кадр.
Имя функции или
"<lambda>"
.Входные аргументы.
Возвращаемое значение.
Строка кода (если она существует).
Следующие два метода могут быть вызваны клиентами для использования отладчика для отладки statement, заданного в виде строки.
- run(cmd, globals=None, locals=None)¶
Отладка оператора, выполняемого с помощью функции
exec()
. globals по умолчанию принимает значение__main__.__dict__
, locals по умолчанию принимает значение globals.
- runeval(expr, globals=None, locals=None)¶
Отладка выражения, выполняемого с помощью функции
eval()
. globals и locals имеют то же значение, что и вrun()
.
- runcall(func, /, *args, **kwds)¶
Отладка одного вызова функции и возврат ее результата.
Наконец, в модуле определены следующие функции:
- bdb.checkfuncname(b, frame)¶
Верните
True
, если мы должны прерваться здесь, в зависимости от того, какBreakpoint
b было установлено.Если она была установлена по номеру строки, то проверяется, совпадает ли
b.line
с номером строки в кадре. Если точка останова была установлена черезfunction name
, необходимо проверить, что мы находимся в правильном кадре (правильной функции) и на первой исполняемой строке.
- bdb.effective(file, line, frame)¶
Верните
(active breakpoint, delete temporary flag)
или(None, None)
в качестве точки останова для действия.Активная точка останова* - это первая запись в
bplist
для (file
,line
) (которая должна существовать), которая являетсяenabled
, для которойcheckfuncname()
истинна, и которая не имеет ни ложногоcondition
, ни положительногоignore
счета. Флаг *, означающий, что временная точка останова должна быть удалена, являетсяFalse
только в том случае, еслиcond
не может быть оценен (в этом случае счетignore
игнорируется).Если такой записи нет, то возвращается
(None, None)
.