关于调试:检查正在运行的进程正在做什么:打印未经检测的Python程序的堆栈跟踪

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进程,并显示当前正在执行的函数,如用于系统调用的strace。你可以这样称呼它:

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,这在每台服务器计算机上都不可用。