4

我正在运行 Emacs 23.2python.el并使用pdb.

我的代码使用该模块生成了一个同级线程,threading并且我在方法的开头设置了一个断点,但是即使代码确实运行并且适用于所有意图和目的,run()也从未处理过中断。pdb

我的印象是我可以用来pdb任何线程中建立断点,即使实际上不支持完整的多线程调试。

pdb假设在M-x 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..."

但这只会中断并提供pdbstep、next、continue等的控制,如果它是从控制台执行并直接在 Python 解释器中运行,并且关键不是通过M-x pdb- 至少使用我的 Emacs 和pdb配置。

所以我最初的问题可能与改写有关:

有没有办法从 Emacs 中调用 Python 程序,该程序使用 pdb 的内联调用(从而支持多线程应用程序中的中断),并且自动建立一个 pdb comint 控制缓冲区?

或者

如果我使用 Mx pdb 运行我的 Python 应用程序并且它包含 pdb 的内联调用,那么如何最好地处理这会导致 pdb-session-within-a-pdb-session 以及相关的失控这一事实?

4

2 回答 2

1

请参阅http://heather.cs.ucdavis.edu/~matloff/158/PLN/ParProcBook.pdf,有一节是关于多线程调试的。

3.6.1 使用 PDB 调试线程程序
当涉及线程时,使用 PDB 会稍微复杂一些。例如,一个人不能简单地做某事
像这样:
pdb.py buggyprog.py
因为子线程不会从主线程继承PDB进程。您仍然可以在
后者,但不能在线程中设置断点。
但是,您可以做的是从线程运行的函数中调用 PDB,方法是调用
pdb.set trace() 在代码中的一个或多个点:
导入 pdb
pdb.set_trace()
从本质上讲,这些成为断点。
例如,在 3.1.1 节的程序 srvr.py 中,我们可以在循环的开头添加一个 PDB 调用
在服务客户端()中:
而1:
导入 pdb
pdb.set_trace()
# 接收来自客户端的信件,如果它仍然连接
k = c.recv(1)
如果 k == '': 中断
然后像往常一样直接通过 Python 解释器运行程序,而不是通过 PDB,然后
程序突然自行进入调试模式。在这一点上,然后可以单步执行代码
使用 n 或 s 命令,查询变量的值等。
PDB 的 c(“继续”)命令仍然有效。仍然可以使用 b 命令设置额外的断点吗?
是的,但可能只是一次性的,具体取决于上下文。断点可能只工作一次,
由于范围问题。离开我们调用 PDB 的范围会导致删除跟踪对象。因此
我建议在上面的循环中设置跟踪。
于 2010-10-05T21:38:31.753 回答
1

您使用的是默认的 python.el 吗?我已经放弃了,开始使用 python-mode.el。然后输入M-x shell, 从提示类型python myproblem.py(当然替换为您的程序名称),它将停在该set_trace行。它与 pdb 集成开箱即用。(它适用于您的程序)。

于 2010-10-05T22:20:21.680 回答