如何使pdb识别源在运行之间发生了更改?

2024-06-08 20:14:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

FWIW,gdb会注意到它正在调试的程序在它下面发生了变化,尽管只是在程序重新启动时。这是我试图在pdb中复制的行为。


Tags: 代码程序源代码bugpdb断点办法gdb
3条回答

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

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

pdb> pdbs.r()

在任何时候强制重新加载除main之外的所有非系统模块。代码跳过此项,因为它抛出了ImportError('Cannot re init internal modulemain')异常。

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

“在pdb中重新运行程序”是什么意思如果您导入了一个模块,Python不会重新读取它,除非您明确要求这样做,即使用reload(module)。然而,reload远不是防弹的(另一个策略见xreload)。

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

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

相关问题 更多 >