Compruebe lo que está haciendo un proceso en ejecución: imprima el seguimiento de la pila de un programa Python no documentado
debugging process (4)
Algunas de las respuestas en Mostrar el seguimiento de pila de una aplicación Python en ejecución son aplicables en esta situación:
pyrasite (este fue el que funcionó para mí):
$ 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 : esto no funcionó, pero el repositorio https://github.com/albertz/pydbattach contiene un puntero a otras herramientas
- pstack imprime la pila de python en Solaris
¿Hay alguna forma en Linux de verificar qué está haciendo un proceso de demonio de Python en ejecución? Es decir, ¿sin instrumentar el código y sin terminarlo? Preferiblemente me gustaría obtener el nombre del módulo y el número de línea que se está ejecutando actualmente.
Las herramientas de depuración convencionales como strace, pstack y gdb no son muy útiles para el código Python. La mayoría de los marcos de pila solo contienen funciones del código del intérprete como PyEval_EvalFrameEx y PyEval_EvalCodeEx, no le da ninguna pista sobre si el archivo .py está ejecutando.
En sistemas POSIX como Linux, puede usar buenos GDB antiguos, vea
- https://t37.net/debug-a-running-python-process-without-printf.html y
- https://wiki.python.org/moin/DebuggingWithGdb
También está el excelente IDE de PyCharm (versión de comunidad gratuita disponible) que se puede adjuntar a un proceso Python en ejecución desde el IDE, utilizando Pdb 4 debajo del capó, consulte esta entrada de blog:
winpdb le permite adjuntar a un proceso de Python en ejecución , pero para hacer esto, debe iniciar el proceso de Python de esta manera:
rpdb2 -d -r script.py
Luego, después de establecer una contraseña:
A password should be set to secure debugger client-server communication.
Please type a password:mypassword
podría iniciar winpdb en Archivo> Adjuntar a (o Archivo> Desconectar) del proceso.
lptrace hace exactamente eso. Le permite adjuntarse a un proceso Python en ejecución y mostrar las funciones que se están ejecutando actualmente, como hace strace
para las llamadas al sistema. Puedes llamarlo así:
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)
...
Tenga en cuenta que requiere gdb para ejecutarse, que no está disponible en todos los servidores.