bdb — Рамка отладчика

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


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

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

exception bdb.BdbQuit

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

runctx(cmd, globals, locals)

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

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

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

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

bdb.checkfuncname(b, frame)

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

Если она была установлена по номеру строки, то проверяется, совпадает ли b.line с той, которая находится во фрейме, также переданном в качестве аргумента. Если точка останова была установлена по имени функции, необходимо проверить, что мы находимся в правильном фрейме (правильной функции) и в первой исполняемой строке.

bdb.effective(file, line, frame)

Определите, существует ли эффективная (активная) точка останова в данной строке кода. Возвращает кортеж из точки останова и булева числа, которое указывает, можно ли удалить временную точку останова. Верните (None, None), если нет подходящей точки останова.

bdb.set_trace()

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

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