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)
, если нет подходящей точки останова.