我正在使用python.el运行Emacs 23.2并使用pdb调试一些Python代码.
我的代码使用线程模块生成一个兄弟线程,我在run()方法的开头设置了一个断点,但是pdb永远不会处理它,即使代码肯定运行并且适用于所有意图和目的.
我的印象是我可以使用pdb在任何线程中建立断点,即使实际上不支持完整的多线程调试.
我错误地假设在一个M-x内的pdb pdb调用可以在任何线程中中断吗?如果你不相信我自己尝试这个最小的例子.
import threading
class ThreadTest(threading.Thread):
def __init__(self,):
threading.Thread.__init__(self)
def run(self):
print "Type M-x pdb, set a breakpoint here then type c <RET>..."
print "As you can see it does not break!"
if __name__ == '__main__':
tt = ThreadTest()
tt.start()
感谢Pierre和他引用的书籍文本,我尝试了包含pdb.set_trace()的选项,如下所示:
def run(self):
import pdb; pdb.set_trace()
print "Set a breakpoint here then M-x pdb and type c..."
但是这只会破坏并为步骤,下一步,继续等提供pdb控件,如果它是从控制台执行并直接在Python解释器中运行,而且至关重要的是不通过M-x pdb – 至少我的Emacs和pdb配置.
所以我原来的问题可以改写:
有没有办法从Emacs中调用Python程序,其中该程序使用内联调用pdb(从而支持多线程应用程序中断),以及是否有自动魔法建立的pdb comint控制缓冲区?
要么
如果我使用M-x pdb运行我的Python应用程序并且它包含pdb的内联调用,那么如何最好地处理这会导致pdb-session-in-a-pdb-session与相关的控制权丧失?
解决方法:
你使用默认的python.el?我已经放弃了并开始使用python-mode.el.然后键入M-x shell,从提示符类型python myproblem.py(当然用你的程序名替换),它将停在set_trace行.它与pdb集成开箱即用. (它适用于您的程序).