题
据我所知,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