在Python里直接调试fork出来的子进程确实有点棘手,因为pdb默认会附着到父进程上。不过有个简单直接的办法:在子进程代码里硬插一个pdb.set_trace()。
具体操作是,在你fork之后子进程要执行的代码块最开始的地方,加上这几行:
import pdb
import sys
def child_process():
# 这是子进程要跑的主要逻辑
print("子进程开始执行")
# 关键在这里:挂起并等待调试器连接
pdb.set_trace()
# 你实际的业务代码从这里继续
result = do_some_work()
return result
然后运行你的脚本,当执行到pdb.set_trace()时,子进程会停下来,在终端里给你一个pdb提示符。这时候你就能像平常一样用pdb命令(比如n下一步、s跳入函数、p打印变量)来调试了。
但要注意,如果子进程是通过os.fork()出来的,你得确保子进程有自己的标准输入输出。有时候在后台跑或者重定向了IO的话,可能会连不上。这种情况可以考虑用pdb.Pdb(stdin=sys.stdin, stdout=sys.stdout)来显式指定。
还有个更现代的选择是用breakpoint()函数(Python 3.7+),这样更干净:
def child_process():
print("子进程启动")
breakpoint() # 这会调用pdb,或者你配置的其他调试器
# ... 其余代码
总结一下,核心就是让子进程自己主动停下来等调试器。