Python Отладка

Python Отладка — процесс доведения программы «до ума».

Python Отладка — сложный творческий процесс, зачастую требующий напряжения всех мозговых извилин программиста для получения желаемого результата.

К сожалению, отладка не рассмотрена в учебнике Python Прохоренок_704 (Прохоренок Н. А. «Python 3 и PyQt. Разработка приложений.» СПб., БХВ-Петербург, 2012., 704 с. с илл.) — в нём даже слово отладка ни разу не упомянуто!

Python Отладка подробно рассмотрена в справочнике Бизли:

Отладчик Python и модуль pdb

В состав Python входит простой отладчик командной строки, который реализован в виде модуля pdb. Модуль pdb поддерживает возможность поставарийной отладки, исследования кадров стека, установки точек останова, выполнения исходного программного кода в пошаговом режиме и вычисления выражений.

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

run(statement [, globals [, locals]])
Выполняет строку statement под управлением отладчика. Приглашение к вводу отладчика появляется непосредственно перед выполнением какого-либо программного кода. Ввод команды ‘continue’ инициирует выполнение этого кода. Аргументы globals и locals определяют глобальное и локальное пространство имен соответственно, в котором будет выполняться программный код.

runeval(expression [, globals [, locals]])
Вычисляет выражение в строке expression под управлением отладчика. Приглашение к вводу отладчика появляется непосредственно перед выполнением какого-либо программного кода, поэтому чтобы вычислить значение выражения, необходимо ввести команду ‘continue’, которая запустит функцию run(). В случае успеха возвращается значение выражения.

runcall(function [, argument, ...])
Вызовет функцию function под управлением отладчика. Аргумент function должен быть вызываемым объектом. Дополнительные аргументы передаются функции function. Приглашение к вводу отладчика появляется непосредственно перед выполнением какого-либо программного кода. По завершении возвращается значение функции function.

set_trace()
Запускает отладчик в точке вызова этой функции. Может использоваться для создания точек останова в интересующих местах программы.

post_mortem(traceback)
Запускает пост-аварийную отладку с использованием объекта traceback, содержащего трассировочную информацию. Объект traceback обычно можно получить с помощью такой функции, как sys.exc_info().

pm()
Переходит в режим поставарийной отладки с использованием объекта traceback, сгенерированного последним исключением. Из всех функций, вызывающих отладчик, самой простой в использовании, пожалуй, является функция set_trace(). Когда при работе со сложным приложением выявляется какая-либо проблема, можно просто вставить вызов set_trace() в программный код и запустить приложение. Когда интерпретатор встретит этот вызов, выполнение программы будет приостановлено и управление будет передано отладчику, с помощью которого можно будет исследовать окружение, в котором протекает выполнение программы. Выполнение программы будет продолжено сразу же после выхода из отладчика.

Команды отладчика

После запуска отладчика выводится приглашение к вводу (Pdb), как показано ниже:
>>> import pdb
>>> import buggymodule
>>> pdb.run(‘buggymodule.start()’)
> <string>(0)?()
(Pdb)

(Pdb) – это приглашение к вводу отладчика, в котором распознаются следующие команды. Обратите внимание, что некоторые команды имеют две формы – краткую и длинную. Для обозначения обеих форм в описании команд использованы круглые скобки. Например, h(elp) означает, что можно ввести команду h или help.

[!]statement
Выполняет инструкцию statement (однострочную) в контексте текущего кадра стека. Символ восклицательного знака можно опустить, но его использование обязательно, если первое слово инструкции statement совпадает с командой отладчика. Чтобы определить глобальную переменную, можно предварить инструкцию присваивания командой «global» в той же строке:
(Pdb) global list_options; list_options = [‘-l’]
(Pdb)

a(rgs)
Выводит список аргументов текущей функции.

alias [name [command]]
Создает псевдоним name для команды command. Подстроки, такие как ‘%1’,’%2’ и так далее, в строке command замещаются значениями параметров, которые указываются при вводе псевдонима. Подстрока ‘%*’ соответствует всему списку параметров. Если значение command не задано, выводится текущее определение псевдонима. Псевдонимы допускается вкладывать друг в друга и они могут содержать всё, что допускается вводить в приглашении Pdb. Например:
# Выводит переменные экземпляров (порядок
# использования: “pi classInst”)
alias pi for k in %1._ _dict_ _.keys(): print “%1.”,k,”=”,%1._ _dict_ _[k]
# Выводит переменные для экземпляра self
alias ps pi self

b(reak) [loc [, condition]]
Устанавливает точку останова в местоположении loc. Значением loc может быть либо имя файла и номер строки, либо имя функции в модуле.

Синтаксис параметра имеет следующий вид:

Значение Описание
n Номер строки в текущем файле
filename:n Номер строки в другом файле
function Имя функции в текущем модуле
module.function Имя функции в другом модуле

Если параметр loc не задан, выводится список всех точек останова, установленных на текущий момент. condition – это выражение, которое должно оцениваться как истина, чтобы произошел останов в данной точке.

Каждой точке останова присваивается свой номер, который выводится по завершении этой команды. Эти номера можно использовать в некоторых других командах отладчика, описываемых ниже.

cl(ear) [bpnumber [bpnumber ...]]
Сбрасывает точки останова с указанными номерами bpnumber. Если номера не указываются, команда сбросит все точки останова.

commands [bpnumber]
Определяет последовательность команд отладчика для автоматического выполнения по достижении точки останова bpnumber. Если необходимо указать несколько команд, их можно ввести в нескольких строках и использовать слово end, как признак конца последовательности. Если включить в последовательность команду continue, после встречи точки останова выполнение программы будет продолжено автоматически. Если параметр bpnumber не задан, команда commands применяется к последней установленной точке останова.

condition bpnumber [condition]
Добавляет условие condition к точке останова bpnumber. Параметр condition – это выражение, значение которого должно оцениваться как истинное, чтобы произошел останов в данной точке. Отсутствие параметра condition приводит к сбросу всех условий, установленных ранее.

c(ont(inue))
Возобновляет выполнение программы, пока не будет встречена следующая точка останова.

disable [bpnumber [bpnumber ...]]
Деактивирует указанные точки останова. В отличие от команды clear, после команды disable имеется возможность вновь активировать эти точки останова.

d(own)
Перемещает текущий кадр стека на один уровень вниз в стеке трассировки.

enable [bpnumber [bpnumber ...]]
Активирует указанные точки останова.

h(elp) [command]
Выводит список доступных команд. Если указана команда command, возвращает справочную информацию по этой команде.

ignore bpnumber [count]
Деактивирует точку останова на count проходов.

j(ump) lineno
Выполняет переход к следующей строке. Может использоваться только для перехода между инструкциями в одном кадре стека. Кроме того, не позволяет выполнить переход внутрь некоторых инструкций, например в середину цикла.

l(ist) [first [, last]]
Выводит листинг исходного программного кода. При использовании без аргументов эта команда выведет 11 строк, окружающих текущую строку (5 строк до и 5 строк после). При использовании с единственным аргументом она выведет 11 строк, начиная с указанной строки. При использовании с двумя аргументами – выведет строки из указанного диапазона. Если значение параметра last меньше значения параметра first, оно будет интерпретироваться, как счетчик строк.

n(ext)
Выполняет инструкции до следующей строки в текущей функции. Если в текущей строке присутствуют вызовы других функций, они не учитываются.

p expression
Вычисляет значение выражения expression в текущем контексте и выводит его.

pp expression
То же, что и команда p, но результат форматируется с использованием модуля pprint.

q(uit)
Выход из отладчика.

r(eturn)
Выполняет инструкции до момента выхода из текущей функции.

run [args]
Перезапускает программу с аргументами командной строки args , которые записываются в переменную sys.argv. Все точки останова и другие настройки отладчика сохраняются.

s(tep)
Выполняет одну строку исходного программного кода и останавливает выполнение внутри вызываемых функций.

tbreak [loc [, condition]]
Устанавливает временную точку останова, которая удаляется после первого срабатывания.

u(p)
Перемещает текущий кадр стека на один уровень вверх в стеке трассировки.

unalias name
Удаляет указанный псевдоним.

until
Продолжает выполнение программы, пока поток выполнения не покинет текущий кадр стека или пока не будет достигнута строка с номером, больше чем у текущей. Например, если останов произошел в последней строке тела цикла, команда until продолжит выполнение всех инструкций, составляющих цикл, пока он не завершится.

w(here)
Выведет трассировку стека.

Отладка из командной строки

Альтернативный метод отладки заключается в том, чтобы вызвать отладчик из командной строки. Например:
% python -m pdb someprogram.py

В данном случае отладчик будет запущен автоматически непосредственно перед запуском программы, что позволит установить точки останова и внести какие-либо изменения в настройки. Чтобы запустить программу, достаточно просто ввести команду continue.

Например, если потребуется отладить функцию split() в программе, где она используется, это можно сделать, как показано ниже:
% python –m pdb someprogram.py
> /Users/beazley/Code/someprogram.py(1)<module>()
-> import splitter
(Pdb) b splitter.split
Breakpoint 1 at /Users/beazley/Code/splitter.py:1
(Pdb) c
> /Users/beazley/Code/splitter.py(18)split()
-> fields = line.split(delimiter)
(Pdb)

Настройка отладчика

Если в текущем каталоге или в домашнем каталоге пользователя присутствует файл .pdbrc, его содержимое будет прочитано и выполнено, как если бы строки из этого файла вводились в приглашении к вводу отладчика.

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

Как видите, Python Отладка оснащена достаточно мощно — проблема состоит в том, чтобы освоить возможности отладчика pdb и научиться ими правильно пользоваться.

Приглашаю всех высказываться в Комментариях. Критику и обмен опытом одобряю и приветствую. В хороших комментариях сохраняю ссылку на сайт автора!

И не забывайте, пожалуйста, нажимать на кнопки социальных сетей, которые расположены под текстом каждой страницы сайта.
Python ОтладкаПродолжение тут…

Deviz_17

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.