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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top