检查正在运行的进程:打印未插桩Python程序的堆栈跟踪
在Linux上,有没有办法查看一个正在运行的Python守护进程在做什么?也就是说,不用修改代码,也不想把它结束掉?我希望能知道当前运行的是哪个模块,以及在这个模块中的哪一行。
一些常规的调试工具,比如strace、pstack和gdb,对于Python代码来说并不是很有用。大多数堆栈信息只包含一些解释器的函数,比如PyEval_EvalFrameEx和PyEval_EvalCodeEx,这些并不能告诉你执行到.py文件的哪一部分。
8 个回答
2
winpdb 让你可以 连接到一个正在运行的 Python 程序,但要做到这一点,你需要这样启动 Python 程序:
rpdb2 -d -r script.py
然后,在设置好密码后:
A password should be set to secure debugger client-server communication.
Please type a password:mypassword
你就可以打开 winpdb,选择 文件 > 连接到 (或者 文件 > 断开连接) 这个程序。
4
py-spy(https://github.com/benfred/py-spy)是一个很有用的工具,可以用来查看正在运行的Python程序。特别是,py-spy dump
这个命令会显示每个线程的调用栈信息,包括函数名、文件名和行号。
11
在显示正在运行的Python应用程序的堆栈跟踪这个问题中,有一些答案适用于这种情况:
pyrasite(这个对我有效):
$ sudo pip install pyrasite $ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope $ sudo pyrasite 16262 dump_stacks.py # dumps stacks to stdout/stderr of the python program
- pydbattach - 我没能让这个工作,但这个库https://github.com/albertz/pydbattach里有指向其他工具的链接
- pstack据说可以在Solaris上打印Python的堆栈