Как заставить PDB распознавать, что источник изменился между пробегами?

StackOverflow https://stackoverflow.com/questions/724924

  •  05-09-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

pdb> pdbs.r()

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

# 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)

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top