Как заставить pdb распознавать, что источник изменился между запусками? - PullRequest
12 голосов
/ 07 апреля 2009

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

Итак, pdb не обновляет скомпилированный код при изменении исходного кода? Если нет, есть ли способ заставить это сделать? Я хотел бы иметь возможность оставаться в одной сессии pdb, чтобы сохранить мои точки останова и тому подобное.

FWIW, gdb заметит, когда отлаживаемая программа изменяется под ним, хотя только при перезапуске этой программы. Это поведение, которое я пытаюсь воспроизвести в pdb.

Ответы [ 3 ]

4 голосов
/ 22 апреля 2014

Следующий мини-модуль может помочь. Если вы импортируете его в сеанс pdb, вы можете использовать:

pdb> pdbs.r()

в любое время для принудительной перезагрузки всех несистемных модулей, кроме main . Код пропускает это, поскольку он генерирует исключение ImportError («Невозможно повторно инициировать внутренний модуль main »).

# pdbs.py - PDB support

from __future__ import print_function

def r():
    """Reload all non-system modules, so a pdb restart
    will reload anything new
    """
    import sys
    # This is likely to be OS-specific
    SYS_PREFIX = '/usr/lib'

    for k, v in sys.modules.items():
        if not hasattr(v, '__file__'):
            continue
        if v.__file__.startswith(SYS_PREFIX):
            continue
        if k == '__main__':
            continue
        print('reloading %s [%s]' % (k, v.__file__))
        reload(v)
3 голосов
/ 07 апреля 2009

Что вы подразумеваете под "перезапустить программу в pdb?" Если вы импортировали модуль, Python не будет перечитывать его, если вы явно не попросите об этом, то есть с reload(module). Однако reload далеко не пуленепробиваемый (см. xreload для другой стратегии).

Есть много подводных камней при перезагрузке кода Python. Чтобы более надежно решить вашу проблему, вы можете обернуть pdb классом, который, например, записывает информацию о вашей точке останова в файл на диске и воспроизводит их по команде.

(Извините, проигнорируйте первую версию этого ответа; пока рано, и я недостаточно внимательно прочитал ваш вопрос.)

1 голос

ipdb %autoreload расширение

6.2.0 документов документа http://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html#module-IPython.extensions.autoreload:

In [1]: %load_ext autoreload

In [2]: %autoreload 2

In [3]: from foo import some_function

In [4]: some_function()
Out[4]: 42

In [5]: # open foo.py in an editor and change some_function to return 43

In [6]: some_function()
Out[6]: 43
...