据我所知,pdb 无法识别源代码在“运行”之间何时发生更改。也就是说,如果我正在调试,请注意一个错误,修复该错误,然后在 pdb 中重新运行该程序(即不退出pdb),pdb不会重新编译代码。即使 pdb 列出了新的源代码,我仍然会调试旧版本的代码。

那么,pdb 不会随着源代码的变化而更新编译后的代码吗?如果没有,有没有办法让它这样做?我希望能够留在单个 pdb 会话中,以保留我的断点等。

FWIW,gdb 会注意到它正在调试的程序何时在其下面发生更改,尽管只有在重新启动该程序时才会注意到。这是我试图在 pdb 中复制的行为。

有帮助吗?

解决方案

您的意思是“重新运行PDB中的程序”?如果您导入了一个模块,则除非您明确要求这样做,否则Python将不会重新阅读它,即和 reload(module). 。然而, reload 远非防弹(参见 重新加载 另一种策略)。

Python 代码重载存在很多陷阱。为了更可靠地解决您的问题,您可以使用一个类来包装 pdb,该类将断点信息记录到磁盘上的文件中,并根据命令回放它们。

(抱歉,忽略这个答案的第一个版本;现在还早,我没有仔细阅读你的问题。)

其他提示

以下迷你模块可能会有所帮助。如果将其导入 pdb 会话中,则可以使用:

pdb> pdbs.r()

随时强制重新加载所有非系统模块,除了 主要的. 。代码会跳过这一点,因为它会抛出 ImportError('Cannot re-init internal module 主要的') 例外。

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

网络数据库 %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