bdb — Рамка отладчика¶
Исходный код: Lib/bdb.py.
Модуль bdb обрабатывает основные функции отладчика, такие как установка точек останова или управление выполнением через отладчик.
Определено следующее исключение:
Модуль bdb также определяет два класса:
-
class
bdb.Breakpoint(self, file, line, temporary=0, cond=None, funcname=None)¶ Этот класс реализует временные точки останова, подсчет игнорирования, отключение и (повторное) включение, а также условные сигналы.
Точки останова индексируются по номеру через список
bpbynumberи по парам(file, line)черезbplist. Первая указывает на один экземпляр классаBreakpoint. Вторая указывает на список таких экземпляров, поскольку в одной строке может быть более одной точки останова.При создании точки останова связанное с ней имя файла должно быть в канонической форме. Если определено funcname, то попадание в точку останова будет засчитано при выполнении первой строки этой функции. Условная точка останова всегда засчитывает попадание.
Экземпляры
Breakpointимеют следующие методы:-
deleteMe()¶ Удаление точки останова из списка, связанного с файлом/линией. Если это последняя точка останова в данной позиции, то удаляется и запись для файла/линии.
-
enable()¶ Пометить точку останова как включенную.
-
disable()¶ Пометить точку останова как отключенную.
-
bpformat()¶ Возвращает строку со всей информацией о точке останова, красиво отформатированную:
Номер точки останова.
Является ли он временным или нет.
Его положение в файле, строке.
Условие, вызывающее разрыв.
Если он должен быть проигнорирован в следующие N раз.
Количество ударов по точке останова.
Добавлено в версии 3.2.
-
bpprint(out=None)¶ Выведите вывод
bpformat()в файл out, или, если этоNone, в стандартный вывод.
-
-
class
bdb.Bdb(skip=None)¶ Класс
Bdbдействует как общий базовый класс отладчика Python.Этот класс заботится о деталях средства трассировки; производный класс должен реализовать взаимодействие с пользователем. Примером может служить стандартный класс отладчика (
pdb.Pdb).Аргумент skip, если он задан, должен быть итерацией шаблонов имен модулей в стиле glob. Отладчик не будет переходить к кадрам, которые возникли в модуле, соответствующем одному из этих шаблонов. Считается ли кадр происходящим из определенного модуля, определяется по
__name__в глобальных именах кадров.Добавлено в версии 3.1: Аргумент пропустить.
Следующие методы
Bdbобычно не нужно переопределять.-
canonic(filename)¶ Вспомогательный метод для получения имени файла в канонической форме, то есть в виде нормализованного по регистру (в файловых системах, нечувствительных к регистру) абсолютного пути, очищенного от окружающих угловых скобок.
-
reset()¶ Установите атрибуты
botframe,stopframe,returnframeиquittingзначениями, готовыми для начала отладки.
-
trace_dispatch(frame, event, arg)¶ Эта функция устанавливается как функция трассировки отлаживаемых кадров. Ее возвращаемым значением является новая функция трассировки (в большинстве случаев это она сама).
Реализация по умолчанию решает, как отправлять кадр, в зависимости от типа события (переданного в виде строки), которое должно быть выполнено. event может быть одним из следующих:
"line": Будет выполнена новая строка кода."call": Сейчас будет вызвана функция или введен другой блок кода."return": Функция или другой блок кода вот-вот вернется."exception": Произошло исключение."c_call": Сейчас будет вызвана функция языка Си."c_return": Вернулась функция языка Си."c_exception": Функция C вызвала исключение.
Для событий Python вызываются специализированные функции (см. ниже). Для событий на языке C никаких действий не предпринимается.
Параметр arg зависит от предыдущего события.
Дополнительные сведения о функции трассировки см. в документации к
sys.settrace(). Для получения дополнительной информации об объектах кода и фрейма см. раздел Стандартная иерархия типов.
-
dispatch_line(frame)¶ Если отладчик должен остановиться на текущей строке, вызовите метод
user_line()(который должен быть переопределен в подклассах). Вызвать исключениеBdbQuit, если установлен флагBdb.quitting(который может быть установлен изuser_line()). Возвращает ссылку на методtrace_dispatch()для дальнейшей трассировки в этой области видимости.
-
dispatch_call(frame, arg)¶ Если отладчик должен остановиться на этом вызове функции, вызовите метод
user_call()(который должен быть переопределен в подклассах). Вызвать исключениеBdbQuit, если установлен флагBdb.quitting(который может быть установлен изuser_call()). Возвращает ссылку на методtrace_dispatch()для дальнейшей трассировки в этой области видимости.
-
dispatch_return(frame, arg)¶ Если отладчик должен остановиться на возврате этой функции, вызовите метод
user_return()(который должен быть переопределен в подклассах). Вызвать исключениеBdbQuit, если установлен флагBdb.quitting(который может быть установлен изuser_return()). Возвращает ссылку на методtrace_dispatch()для дальнейшей трассировки в этой области видимости.
-
dispatch_exception(frame, arg)¶ Если отладчик должен остановиться на этом исключении, вызывается метод
user_exception()(который должен быть переопределен в подклассах). Вызывает исключениеBdbQuit, если установлен флагBdb.quitting(который может быть установлен изuser_exception()). Возвращает ссылку на методtrace_dispatch()для дальнейшей трассировки в этой области видимости.
Обычно производные классы не переопределяют следующие методы, но они могут это сделать, если хотят переопределить определение остановок и точек останова.
-
stop_here(frame)¶ Этот метод проверяет, находится ли фрейм где-то ниже
botframeв стеке вызовов.botframe- это кадр, в котором началась отладка.
-
break_here(frame)¶ Этот метод проверяет, существует ли точка останова в имени файла и строке, принадлежащей кадру или, по крайней мере, в текущей функции. Если точка останова является временной, этот метод удаляет ее.
-
break_anywhere(frame)¶ Этот метод проверяет, существует ли точка останова в имени файла текущего кадра.
Производные классы должны переопределять эти методы, чтобы получить контроль над работой отладчика.
-
user_call(frame, argument_list)¶ Этот метод вызывается из
dispatch_call(), когда есть вероятность, что в любом месте внутри вызываемой функции может потребоваться прерывание.
-
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)¶ Остановка при достижении линии, не превышающей текущую, или при возврате из текущего кадра.
-
set_trace([frame])¶ Начать отладку с кадра. Если frame не указан, отладка начинается с фрейма вызывающей стороны.
-
set_continue()¶ Останавливайтесь только в точках останова или по завершении работы. Если точек останова нет, установите для функции системной трассировки значение
None.
-
set_quit()¶ Установите атрибут
quittingв значениеTrue. Это повышает значениеBdbQuitпри следующем вызове одного из методовdispatch_*().
Производные классы и клиенты могут вызывать следующие методы для работы с точками останова. Эти методы возвращают строку с сообщением об ошибке, если что-то пошло не так, или
None, если все в порядке.-
set_break(filename, lineno, temporary=0, cond, funcname)¶ Установите новую точку останова. Если строка 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.Добавлено в версии 3.2.
-
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>".Входные аргументы.
Возвращаемое значение.
Строка кода (если она существует).
Следующие два метода могут быть вызваны клиентами для использования отладчика для отладки 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)¶ Проверьте, должны ли мы прерваться здесь, в зависимости от того, как была установлена точка останова b.
Если она была установлена по номеру строки, то проверяется, совпадает ли
b.lineс той, которая находится во фрейме, также переданном в качестве аргумента. Если точка останова была установлена по имени функции, необходимо проверить, что мы находимся в правильном фрейме (правильной функции) и в первой исполняемой строке.
-
bdb.effective(file, line, frame)¶ Определите, существует ли эффективная (активная) точка останова в данной строке кода. Возвращает кортеж из точки останова и булева числа, которое указывает, можно ли удалить временную точку останова. Верните
(None, None), если нет подходящей точки останова.