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: Аргумент skip.

Следующие методы Bdb обычно не требуется переопределять.

canonic(filename)

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

reset()

Задание атрибутов botframe, stopframe, returnframe и quitting со значениями, готовыми к началу отладки.

trace_dispatch(frame, event, arg)

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

Реализация по умолчанию определяет способ отправки фрейма в зависимости от типа события (передаваемого как строка), которое должно быть выполнено. event может быть одним из следующих

  • "line": новая линия код будет выполнена.
  • "call": вызывается функция или вводится другой блок код.
  • "return": функция или другой блок кода скоро возвратят.
  • "exception": произошло исключение.
  • "c_call": сейчас будет вызвана функция C.
  • "c_return": функция C содержит возвращаемое значение.
  • "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_line()). Возвращает ссылку на метод trace_dispatch() для дальнейшей трассировки в этой области видимости.

dispatch_return(frame, arg)

Если отладчик должен возвращает остановиться на этой функции, вызовите user_return() метод (который должен быть переопределен в подклассами). Создайте BdbQuit исключение, если Bdb.quitting флаг установлен (который можно установить из user_return()). Возвращает ссылку на trace_dispatch() метод для дальнейшей трассировки в этом область видимости.

dispatch_exception(frame, arg)

Если отладчик должен остановиться на этом исключении, вызывает user_exception() метод (который должен быть переопределен в подклассes). Создайте BdbQuit исключение, если Bdb.quitting флаг установлен (который можно установить из user_exception()). Возвращает ссылку на trace_dispatch() метод для дальнейшей трассировки в этом область видимости.

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

stop_here(frame)

Метод проверяет, находится ли frame где-то ниже botframe в стэке вызовов. botframe является фреймом, в котором запущена отладка.

break_here(frame)

Метод проверяет наличие точки останова в имени файла и строке, принадлежащей 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)

Останавливается при достижении строки, не превышающей текущую, или при возвращаетing из текущего фрейма.

set_trace([frame])

Начать отладку с 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>".
  • Входные аргументы.
  • Возвращаемые значения.
  • Строка кода (если она существует).

Следующие два метода могут быть вызваны клиентами для использования отладчика для отладки инструкция в виде строки.

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 из вызывающего фрейма.