从我所知道的来看,PDB不能识别源代码在“运行”之间的变化。也就是说,如果我在调试,注意到一个bug,修复那个bug,并在PDB中重新编译程序(即不退出PDB),PDB将不会重新编译代码。我仍然会调试旧版本的代码,即使PDB列出了新的源代码。
那么,当源代码发生变化时,PDB不会更新编译后的代码吗?如果不是,有没有办法让它这样做?我希望能够保持在一个单独的PDB会话中,以保持我的断点等。
FWIW,gdb会注意到它正在调试的程序在它下面发生的变化,尽管只有在程序重新启动时。这是我试图在pdb中复制的行为。
7条答案
按热度按时间gk7wooem1#
下面的小模块可能会有所帮助。如果您在PDB会话中导入它,则可以用途:
强制重新加载除main以外的所有非系统模块。代码跳过了这一步,因为它抛出了一个ImportError('Cannot re-init internal module**main*')异常。
wlwcrazw2#
基于@pourhaus answer(从2014年开始),这个配方用
reload
命令增强了 *pdb++
调试器 *(预计在任何Python安装的Linux和Windows上都可以工作)。提示:新的
reload
命令接受一个可选的模块前缀列表来重新加载(和 exclude),而不是在恢复调试时中断已经加载的 globals。只需将以下 Python-3.6 代码插入到
~/.pdbrc.py
文件中:lawou6xi3#
如果你已经导入了一个模块,Python不会重新读取它,除非你明确要求这样做,即使用
reload(module)
。然而,reload
远不是防弹的(另一种策略见xreload)。在Python代码重载中有很多陷阱。为了更健壮地解决问题,您可以使用一个类 Package PDB,该类将断点信息记录到磁盘上的文件中,并在命令下播放它们。
(对不起,忽略这个答案的第一个版本;现在还为时过早,我没有仔细阅读你的问题。
goucqfw64#
我决定在输入脚本中注解一些行,
我让pdb认识到了这个变化。坏的方面:它从一开始就运行脚本。下面是好的方面。
y53ybaqx5#
可能不适用于更复杂的程序,但对于使用Python v3.5.3使用
importlib.reload()
的简单示例:ivqmmu1c6#
我是Python的新手,但在阅读了其他答案后,我对这个问题有了一个想法,如果你“注意到一个bug,修复那个bug,并在PDB中重新编译程序(即不退出PDB),”那么您希望PDB继续使用的状态(断点、命令等)的作用也不会很好,特别是因为行号可能已经更改,与断点相关的任何逻辑以及它们使用的条件都可能被破坏。
对于那些你不想重复输入的有用的调试命令,文档说“如果一个文件.pdbrc存在于用户的主目录或当前目录中,它将以'utf-8'编码读取并执行,就像它在调试器提示符下输入一样。”
这里要解决的最后一个大问题是如何在PDB中保留有用的
commands
命令,因为alias
没有指定如何别名多行PDB命令(我只知道commands
)。zvms9eto7#
ipdb
%autoreload
扩展名6.2.0 docs文档http://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html#module-IPython.extensions.autoreload: