1

所以,我有一些这样的代码:

class ProgressProc(multiprocessing.Process):
    def __init__(self):
        multiprocessing.Process.__init__(self)

    def run(self):
        while True:
            markProgress()
            time.sleep(10)

progressProc = ProgressProc()
progressProc.start()
doSomething()
progressProc.terminate()

问题是,如果我在 doSomething() 函数中执行 pdb.set_trace(),ProgressProc 进程会继续进行。在 pdb 提示符处于活动状态时,它会不断将内容打印到控制台。我想要的是让 ProgressProc 有一些方法来检查主线程(实际上,任何其他线程)是否在 pdb 中暂停,然后我可以跳过 markProgress()。

有 sys.gettrace(),但这仅适用于执行 pdb.set_trace() 的线程,我不知道如何在与我所在的线程不同的线程上调用它。我还能做什么? 我能捕捉到任何信号吗?我可以让我的主要方法替换 pdb.set_trace 以首先调用一些 multiprocessing.Event 。有没有更清洁的方法?

ETA:这也适用于 python gdb 命令。

4

1 回答 1

0

Pdb 目前无法使用多个线程或进程进行调试。但是,我希望以下内容可以帮助您。

此解决方案使用 Pdb 暂停主线程,然后向启动Rpdb的其他进程发送信号。

在运行中打开一个套接字。确保将超时设置为 0。当进程收到信号时,使用rpdb.set_trace().

signal = 'break'
address = ('localhost', 6000)

def run(self):
    listener = Listener(address=address)
    listener._listener._socket.settimeout(0)
    recvd = False
    while True:
        markProgress()
        if not recvd:
            try:
                conn = listener.accept()
                msg = conn.recv()
                if msg == signal:
                    recvd = True
                    rpdb.set_trace()
            except:
                pass
        time.sleep(2)

set_trace()像以前一样在里面做doSomething(),然后连接到套接字并发送信号。

def doSomething():
    pdb.set_trace()
    conn = Client(address)
    conn.send(signal)
    conn.close()
    for x in range(100):
        time.sleep(1)
        sys.__stdout__.write("doSomething: " + str(x) + "\n")

现在你可以开始你的程序了。发送信号后,您应该得到输出pdb is running on 127.0.0.1:4444。现在打开第二个终端并使用nc localhost 4444.

  • 这仅适用于两个进程/线程。如果您想使用更多,您可以尝试为每个进程使用不同的端口启动 Rpdb,如下所示:rpdb.Rpdb(port=12345)
  • 您可能必须将所有prints 更改为sys.__stdout__.write,因为 Rpdb 更改了标准输出。
于 2019-05-08T07:09:11.820 回答