Как я могу заставить ipdb показывать больше строк контекста при отладке? - PullRequest
36 голосов
/ 05 июня 2011

По умолчанию во время отладки в IPython ipdb показывает одну строку выше и одну строку ниже текущей позиции в коде.

Есть ли простой способ сделать область немного больше? Я бы подумал, что это можно настроить, но не смог найти его.

Ответы [ 5 ]

39 голосов
/ 05 февраля 2013

Вы можете набрать l в ipdb, чтобы показать еще несколько строк текущего контекста

и вы можете продолжать нажимать l, и он продолжает показывать больше строк из файла

Если вы хотите показать больше строк контекста вокруг текущей строки, вы можете набрать l, чтобы получить текущую строку. А затем наберите l curr_line - 10, curr_line + 10. Скажем, я был на линии 50, и я хотел увидеть окружающие 20 линий. Я бы набрал: l 40,60 чтобы увидеть больше.

Как отметил @jrieke в комментарии, вы также можете нажать ll, чтобы получить большую часть контекста. * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * Хорошая вещь о ll в том, что она будет печатать весь путь назад от начала текущего метода (тогда как последовательные l s показывают дальнейшие строки ниже вашей точки прерывания).

15 голосов
/ 09 марта 2016

Вы можете получить больше контекста, выполнив:

ipdb.set_trace(context=21)

(есть ошибка , введенная в 0.10.0, которая ломает это, но это должно быть исправлено в ближайшее время)

Постоянный размер контекста

Чтобы навсегда установить размер контекста, найдите каталог установки, выполнив

python -c 'import ipdb; print(ipdb)'

, который покажет вам файл __init__.py.Откройте этот файл и найдите строку (которая также может быть найдена в IPDB __main__.py:

def set_trace(frame=None, context=3):

, измените 3 на любое количество контекстных строк, которые вы хотите.

12 голосов
/ 23 июня 2011

ОК, я нашел место в исходном коде IPython для этого.В моей установке это на

.../python2.7/site-packages/ipython-0.10.2-py2.7.egg/IPython/Debugger.py:327:

Измените это:

def print_stack_entry(self,frame_lineno,prompt_prefix='\n-> ',
                      context = 3):

на

def print_stack_entry(self,frame_lineno,prompt_prefix='\n-> ',
                      context = 11):

Это потрясающе!

Для IPython 4.0.1, в debugger.py просто добавьте это:

class Pdb(OldPdb):
  """Modified Pdb class, does not load readline."""

  def __init__(self,color_scheme='NoColor',completekey=None,
               stdin=None, stdout=None, context=None):
      context=20
1 голос

В качестве быстрого дополнения к https://stackoverflow.com/a/35883288/895245 это тот вкладыш, который вы обычно хотите добавить к коду, который вы хотите отлаживать:

__import__('ipdb').set_trace(context=21)

Скорее всего, вы хотите добавить ярлык длячто из вашего редактора, например, для Vim snipmat У меня есть:

snippet ipd
    __import__('ipdb').set_trace(context=21)

, поэтому я могу набрать только ipd<tab>, и оно расширяется до точки останова.Тогда удалить это легко с помощью dd, поскольку все содержится в одной строке.

0 голосов
/ 30 мая 2019

Если вы хотите остановить выполнение в работающей системе, как говорили другие, используйте:

ipdb.set_trace(context=number_of_lines)

Для запуска какой-либо функции или метода объекта изменение этих строк контекста немного сложнее. Единственный способ, который я нашел, был:

ipdb.__main__._init_pdb(context=number_of_lines).runcall(callable, *args, **kwargs)

На случай, если это кому-нибудь послужит.

...