我开始在GNU Emacs 24.3.1中使用realgud
作为GUD的替代方案。 (主要是因为当我用vanilla pdb设置断点时,它不尊重它。)
我正在使用pdb bin/start_openerp
启动OpenERP Web服务器并打开主脚本。但我需要能够在我正在处理的缓冲区中放置断点。
我需要如何将缓冲区附加到调试器。
对于OpenERP开发我正在使用buildout和anybox recipe。这将创建bin/start_openerp
脚本,重写sys.path
以匹配我的buildout环境。
我正在开发几个OpenERP的自定义插件。所以当我需要进入调试器会话以解决问题时,我正在编辑一些。我做了以下事情:
pdb bin/start_openerp
。这将打开脚本,ShortKeys
次要模式处于活动状态。如果我在realgud缓冲区上执行break file:lineno
命令,它就会起作用,并且会中断休息。但我需要转到其中一个缓冲区并在某些行中使用该点,在那里设置断点。
答案 0 :(得分:4)
这里有一个必须克服的概念性问题。
但首先,我需要定义几个术语。您可以在“命令缓冲区”中看到(Pdb)
,它具有与之关联的Python进程和调试程序。 “源代码缓冲区”是一个包含Python源代码的Emacs缓冲区。
在调试多个Python会话时,有几个命令缓冲区。有几个命令缓冲区可能在它们在运行Python程序时停止的过程中的某个时刻引用相同的Python源代码。因此,从Python源代码的缓冲区内部,如何区分您希望断点发生在几个Python会话中的哪一个?
当您在其中一个会话中停止时,命令缓冲区会知道您的位置。它安排提取源代码缓冲区并将其自身与源代码缓冲区相关联。源代码缓冲区存储与之关联的Python命令缓冲区。在理想的世界中,它将存储所有相关的命令缓冲区并将条纹标记与正确的调试器进程相关联,但是现在它只能存储一个指向命令缓冲区的指针。
源代码缓冲区也可以进入“短按键模式”。在这里,在任何行上键入“b”将在与该源代码缓冲区相关联的Python进程中的该行设置断点。
但是假设有几个会话并且您在源代码缓冲区中并且不知道哪个命令缓冲区与之关联?当从源缓冲区内部运行时,Emacs命令和函数 realgud:srcbuf-info-describe 将显示有关源代码缓冲区的信息,包括与之关联的命令缓冲区。
因此,设置与正确的Python进程关联的源代码缓冲区的一种简单方法是从右侧命令缓冲区设置断点,然后清除断点。源代码缓冲区将处于短键模式,然后您可以在任何行上键入“b”,这将转到正确的Python会话。
Emacs realgud函数 realgud-srcbuf-init-or-update 可用于使用命令缓冲区初始化任何Python缓冲区,但请注意,这不是交互式命令。您需要拥有命令缓冲区对象和源代码缓冲区
最后,让我为Python2添加类似pdb和更像gdb的调试器trepan2,为Python3添加trepan3k。
有关源缓冲区的更多信息,请参阅emacs-dbgr/common/buffer/source.el。