bdb — Платформа отладчика

Исходный код: Lib/bdb.py


Модуль bdb обрабатывает основные функции отладчика, такие как установка точек останова или управление выполнением с помощью отладчика.

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

exception bdb.BdbQuit

Исключение, созданное классом 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()

Возвращает строку со всей информацией о точке останова, красиво отформатированную:

  • Номер точки останова.

  • Временный статус (исключен или сохранен).

  • Положение файла/строки.

  • Условие разрыва.

  • Количество раз, которое нужно проигнорировать.

  • Количество попаданий.

Добавлено в версии 3.2.

bpprint(out=None)

Выведите выходные данные bpformat() в файл out, или, если это None, в стандартный вывод.

Breakpoint экземпляры имеют следующие атрибуты:

file

Имя файла Breakpoint.

line

Номер строки Breakpoint внутри file.

temporary

Истинно, если Breakpoint значение at (файл, строка) является временным.

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: Добавлен параметр пропустить.

Следующие методы 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_return": Возвращена функция языка Си.

  • "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, если frame находится ниже начального кадра в стеке.

break_here(frame)

Возвращает значение True, если для этой строки существует эффективная точка останова.

Проверьте, существует ли и действует ли точка останова строки или функции. Удалите временные точки останова на основе информации из effective().

break_anywhere(frame)

Возвращает значение True, если для имени файла 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, lineno=None)

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

set_trace([frame])

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

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.

Добавлено в версии 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(). глобальные значения и локальные значения имеют то же значение, что и в run().

runctx(cmd, globals, locals)

Для обеспечения обратной совместимости. Вызывает метод run().

runcall(func, /, *args, **kwds)

Отладьте один вызов функции и верните его результат.

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

bdb.checkfuncname(b, frame)

Верните значение True, если мы должны прервать его здесь, в зависимости от того, как был установлен Breakpoint b.

Если он был задан с помощью номера строки, он проверяет, совпадает ли b.line с номером в frame. Если точка останова была установлена с помощью 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, Нет).

bdb.set_trace()

Начните отладку с экземпляра Bdb из фрейма вызывающего объекта.

Вернуться на верх