Monday, June 2, 2008

Небольшое дополнение к отладчику pdb

В последнее время почему-то возникают значительные трудности с написанием каких-либо постов, несмотря на то, что тем, которые можно было бы осветить - множество. Так, я забыл написать об Exception #08, от которого у меня остались неизгладимые впечатления(благо, отчеты с Exception уже есть и я не уверен, что у меня получилось бы лучше). Также весьма жалею о том, что не могу осветить некоторые глубоко интересные мне темы, по большей части связанные с программированием на Python.
Дабы хоть как-то обновить наполнение, решил предложить нижеприведенный простенький рецепт.

Итак, несмотря на то, что существует множество весьма удобных IDE, которые предоставляют графические инструменты для отладки Python приложений, иногда бывает намного удобнее воспользоваться отладчиком pdb - он позволяет вам очень быстро окунуться именно в ту часть кода, которая вам нужна. Как известно, самый простой способ использования - это прописать

import pdb
pdb.set_trace()
в то место, где вы хотите прервать выполнение, а после этого командами step(s) и next(n) продвигаться по коду. Также стоит отметить, что неопознанные команды распознаются как Python-команды, что позволяет выполнять какой-либо проверочный код прямо в ходе отладки. Для того, чтобы не заблудиться в отлаживаемом и проверочном коде часто используется команда list (l), которая показывает исходный код места, в котором сейчас остановилось выполнение. Одним из недостатков данной команды можно считать то, что последовательное выполнение нескольких команд list действительно "листает" код, т.е., если два раза выполнить команду list, то будет сначала показано несколько строчек, обрамляющих текущую строку, а потом - следующие несколько строчек. Такое поведение может очень раздражать, если вы хотите просто вспомнить, а где же вы сейчас находитесь, вместо того, чтобы листать код.
Т.о., появляется желание немного дополнить pdb, чтобы добавить возможность просматривать код без пролистыванья. Благодаря динамичности Python, можно предложить такое решение:
def do_ll(self,arg):
return self.do_list(str(self.curframe.f_lineno))

import pdb

pdb.Pdb.do_ll = do_ll
pdb.set_trace()
Этот код добавляет новую команду ll (LL маленькими буквами), которая пользуется возможностями команды list выводить определенные строки кода. При этом очень важно то, что исходный код pdb не меняется.

Проверено на Python 2.4.4

0 comments:

Post a Comment