Check what a running process is doing: print stack trace of an uninstrumented Python program
在Linux上有没有办法检查运行中的python守护进程在做什么?也就是说,不检测代码也不终止代码?最好是我想得到模块的名称和当前运行的模块中的行号。
传统的调试工具(如strace、pstack和gdb)对Python代码不太有用。大多数堆栈帧只包含来自解释器代码的函数,比如pyeval_evalframex和pyeval_evalcodex,它不会给您任何提示,提示在.py文件中执行。
显示运行中的python应用程序的堆栈跟踪的一些答案适用于这种情况:
吡拉西特(这是为我工作的那个):
1
2
3$ 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堆栈
在Linux等POSIX系统上,您可以使用好的旧gdb,请参见
- https://t37.net/debug-a-running-python-process-without-printf.html和
- https://wiki.python.org/moin/debuggingwithgdb
还有一个优秀的pycharm-ide(可用的免费社区版本),它可以从IDE内部附加到正在运行的python进程,在引擎盖下使用pdb 4,请参见以下博客条目:
- http://blog.jetbrains.com/pycharm/2015/02/feature-spotlight-python-debugger-and-attach-to-process/
winpdb允许您附加到正在运行的python进程,但要执行此操作,必须以以下方式启动python进程:
1 | rpdb2 -d -r script.py |
然后,在设置密码之后:
1 2 | A password should be set to secure debugger client-server communication. Please type a password:mypassword |
您可以启动winpdb to file>attach to(或file>detach from)进程。
lptrace就是这样做的。它允许您附加到正在运行的python进程,并显示当前正在执行的函数,如用于系统调用的
1 2 3 4 5 6 7 | vagrant@precise32:/vagrant$ sudo python lptrace -p $YOUR_PID fileno (/usr/lib/python2.7/SocketServer.py:438) meth (/usr/lib/python2.7/socket.py:223) fileno (/usr/lib/python2.7/SocketServer.py:438) meth (/usr/lib/python2.7/socket.py:223) ... |
请注意,它需要运行gdb,这在每台服务器计算机上都不可用。