Como fazer o PDB reconhecer que a fonte mudou entre as execuções?
Pergunta
Pelo que posso dizer, o PDB não reconhece quando o código -fonte mudou entre "execuções". Ou seja, se estou depurando, observe um bug, corrija esse bug e execute o programa no PDB (ou seja, sem sair do PDB), o PDB não recompilará o código. Ainda vou depurar a versão antiga do código, mesmo que o PDB lista o novo código -fonte.
Então, o PDB não atualiza o código compilado conforme a fonte muda? Caso contrário, existe uma maneira de fazê -lo? Eu gostaria de poder ficar em uma única sessão do PDB para manter meus pontos de interrupção e tal.
FWIW, GDB notará quando o programa está depuração muda por baixo dele, embora apenas em uma reinicialização desse programa. Este é o comportamento que estou tentando replicar no PDB.
Solução
O que você quer dizer com "execute o programa no PDB?" Se você importou um módulo, Python não o releria a menos que você peça explicitamente para fazê -lo, ou seja, com reload(module)
. No entanto, reload
está longe de ser à prova de balas (ver xreload para outra estratégia).
Existem muitas armadilhas na recarga do código Python. Para resolver com mais robustez o seu problema, você pode envolver o PDB com uma classe que registra suas informações de ponto de interrupção em um arquivo no disco, por exemplo, e as reproduz de volta no comando.
(Desculpe, ignore a primeira versão desta resposta; é cedo e eu não li sua pergunta com cuidado.)
Outras dicas
O mini-módulo a seguir pode ajudar. Se você o importar na sua sessão do PDB, poderá usar:
pdb> pdbs.r()
a qualquer momento para forçar-se a todos os módulos que não são do sistema, exceto a Principal. O código pula isso porque joga um importador ('não pode reiniciar o módulo interno a Principal') Exceção.
# 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
extensão
6.2.0 documentos documentos http://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html#module-iphython.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