Как заставить PDB распознавать, что источник изменился между пробегами?
Вопрос
Из того, что я могу сказать, 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